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