internal/cpu: add aarch64 support functions
[platform/upstream/gcc.git] / libgo / mklinknames.awk
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
15 BEGIN {
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 }