|  | // 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) | 
|  | } |