1// run
2
3// Copyright 2018 The Go Authors. All rights reserved.
4// Use of this source code is governed by a BSD-style
5// license that can be found in the LICENSE file.
6
7// Loads of 8 byte go.strings cannot use DS relocation
8// in case the alignment is not a multiple of 4.
9
10package main
11
12import (
13        "fmt"
14)
15
16type Level string
17
18// The following are all go.strings. A link time error can
19// occur if an 8 byte load is used to load a go.string that is
20// not aligned to 4 bytes due to the type of relocation that
21// is generated for the instruction. A fix was made to avoid
22// generating an instruction with DS relocation for go.strings
23// since their alignment is not known until link time.
24
25// This problem only affects go.string since other types have
26// correct alignment.
27
28const (
29        LevelBad Level = "badvals"
30        LevelNone Level = "No"
31        LevelMetadata Level = "Metadata"
32        LevelRequest Level = "Request"
33        LevelRequestResponse Level = "RequestResponse"
34)
35
36func ordLevel(l Level) int {
37        switch l {
38        case LevelMetadata:
39                return 1
40        case LevelRequest:
41                return 2
42        case LevelRequestResponse:
43                return 3
44        default:
45                return 0
46        }
47}
48
49//go:noinline
50func test(l Level) {
51        if ordLevel(l) < ordLevel(LevelMetadata) {
52                fmt.Printf("OK\n")
53        }
54}
55
56func main() {
57        test(LevelMetadata)
58}
59