Skip to content

Commit

Permalink
compiler,runtime: fix multiple definitions of a single function
Browse files Browse the repository at this point in the history
strings.IndexByte was implemented in the runtime up to Go 1.11. It is
implemented using a direct call to internal/bytealg.IndexByte since Go
1.12.

Make sure we remain compatible with both.
  • Loading branch information
aykevl authored and deadprogram committed May 24, 2019
1 parent 7e6a54a commit f2cd4d1
Show file tree
Hide file tree
Showing 5 changed files with 26 additions and 3 deletions.
3 changes: 3 additions & 0 deletions compiler/compiler.go
Original file line number Diff line number Diff line change
Expand Up @@ -820,6 +820,9 @@ func (c *Compiler) parseFunc(frame *Frame) {
if c.DumpSSA {
fmt.Printf("\nfunc %s:\n", frame.fn.Function)
}
if !frame.fn.LLVMFn.IsDeclaration() {
panic("function is already defined: " + frame.fn.LLVMFn.Name())
}
if !frame.fn.IsExported() {
frame.fn.LLVMFn.SetLinkage(llvm.InternalLinkage)
frame.fn.LLVMFn.SetUnnamedAddr(true)
Expand Down
7 changes: 4 additions & 3 deletions src/runtime/string.go
Original file line number Diff line number Diff line change
Expand Up @@ -166,9 +166,10 @@ func decodeUTF8(s string, index uintptr) (rune, uintptr) {
}
}

// indexByte returns the index of the first instance of c in s, or -1 if c is not present in s.
//go:linkname indexByte strings.IndexByte
func indexByte(s string, c byte) int {
// indexByteString returns the index of the first instance of c in s, or -1 if c
// is not present in s.
//go:linkname indexByteString internal/bytealg.IndexByteString
func indexByteString(s string, c byte) int {
for i := 0; i < len(s); i++ {
if s[i] == c {
return i
Expand Down
12 changes: 12 additions & 0 deletions src/runtime/strings_go111.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// +build !go1.12

package runtime

// indexByte provides compatibility with Go 1.11.
// See the following:
// https://github.com/tinygo-org/tinygo/issues/351
// https://github.com/golang/go/commit/ad4a58e31501bce5de2aad90a620eaecdc1eecb8
//go:linkname indexByte strings.IndexByte
func indexByte(s string, c byte) int {
return indexByteString(s, c)
}
6 changes: 6 additions & 0 deletions testdata/stdlib.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,18 @@ import (
"fmt"
"math/rand"
"os"
"strings"
)

func main() {
// package os, fmt
fmt.Println("stdin: ", os.Stdin.Fd())
fmt.Println("stdout:", os.Stdout.Fd())
fmt.Println("stderr:", os.Stderr.Fd())

// package math/rand
fmt.Println("pseudorandom number:", rand.Int31())

// package strings
fmt.Println("strings.IndexByte:", strings.IndexByte("asdf", 'd'))
}
1 change: 1 addition & 0 deletions testdata/stdlib.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@ stdin: 0
stdout: 1
stderr: 2
pseudorandom number: 1298498081
strings.IndexByte: 2

0 comments on commit f2cd4d1

Please sign in to comment.