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