]> git.ipfire.org Git - thirdparty/gcc.git/blame - libgo/mklinknames.awk
Fix boostrap failure in tree-ssa-loop-ch.cc
[thirdparty/gcc.git] / libgo / mklinknames.awk
CommitLineData
0cdde1e7
NB
1# Copyright 2020 The Go Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style
3# license that can be found in the LICENSE file.
4
5# This AWK script reads a Go file with special //extern-sysinfo
6# comments annotating functions which should be linked to libc
7# functions. It generates a Go file containing the appropriate
8# //go:linkname directives.
9#
10# For each annotated function, the script searches gen-sysinfo.go
11# to see if a different assembly name is known for the function.
12# For example, on NetBSD, the timegm symbol is renamed to
13# __timegm50 by an __asm__ annotation on its declaration in time.h.
14
15BEGIN {
16 print "// Code generated by mklinknames.awk. DO NOT EDIT."
17 print ""
18 print "package", package
19 print ""
20 print "import _ \"unsafe\""
21 print ""
22}
23
24/^\/\/extern-sysinfo/ {
25 cfnname = $2
26 getline
27 if ($1 != "func") {
28 printf("mklinknames.awk: error: %s:%d: unattached extern-sysinfo directive\n", FILENAME, FNR) | "cat 1>&2"
29 exit 1
30 }
31 split($2, a, "(")
32 gofnname = a[1]
33 def = sprintf("grep '^func _%s[ (]' gen-sysinfo.go", cfnname)
34 # def looks like one of the following:
35 # func _timegm (*_tm) int64 __asm__("__timegm50")
36 # func _timegm (*_tm) int64 __asm__("*__timegm50")
37 # The goal is to extract "__timegm50".
38 if ((def | getline fndef) > 0 && match(fndef, "__asm__\\(\"\\*?")) {
39 asmname = substr(fndef, RSTART + RLENGTH)
40 asmname = substr(asmname, 0, length(asmname) - 2)
41 printf("//go:linkname %s %s\n", gofnname, asmname)
42 } else {
43 # Assume the asm name is the same as the declared C name.
44 printf("//go:linkname %s %s\n", gofnname, cfnname)
45 }
46}