| // 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. | |
| // Loads of 8 byte go.strings cannot use DS relocation | |
| // in case the alignment is not a multiple of 4. | |
| package main | |
| import ( | |
| "fmt" | |
| ) | |
| type Level string | |
| // The following are all go.strings. A link time error can | |
| // occur if an 8 byte load is used to load a go.string that is | |
| // not aligned to 4 bytes due to the type of relocation that | |
| // is generated for the instruction. A fix was made to avoid | |
| // generating an instruction with DS relocation for go.strings | |
| // since their alignment is not known until link time. | |
| // This problem only affects go.string since other types have | |
| // correct alignment. | |
| const ( | |
| LevelBad Level = "badvals" | |
| LevelNone Level = "No" | |
| LevelMetadata Level = "Metadata" | |
| LevelRequest Level = "Request" | |
| LevelRequestResponse Level = "RequestResponse" | |
| ) | |
| func ordLevel(l Level) int { | |
| switch l { | |
| case LevelMetadata: | |
| return 1 | |
| case LevelRequest: | |
| return 2 | |
| case LevelRequestResponse: | |
| return 3 | |
| default: | |
| return 0 | |
| } | |
| } | |
| //go:noinline | |
| func test(l Level) { | |
| if ordLevel(l) < ordLevel(LevelMetadata) { | |
| fmt.Printf("OK\n") | |
| } | |
| } | |
| func main() { | |
| test(LevelMetadata) | |
| } |