| # Copyright 2020 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. | |
| # This AWK script reads a Go file with special //extern-sysinfo | |
| # comments annotating functions which should be linked to libc | |
| # functions. It generates a Go file containing the appropriate | |
| # //go:linkname directives. | |
| # | |
| # For each annotated function, the script searches gen-sysinfo.go | |
| # to see if a different assembly name is known for the function. | |
| # For example, on NetBSD, the timegm symbol is renamed to | |
| # __timegm50 by an __asm__ annotation on its declaration in time.h. | |
| BEGIN { | |
| print "// Code generated by mklinknames.awk. DO NOT EDIT." | |
| print "" | |
| print "package", package | |
| print "" | |
| print "import _ \"unsafe\"" | |
| print "" | |
| } | |
| /^\/\/extern-sysinfo/ { | |
| cfnname = $2 | |
| getline | |
| if ($1 != "func") { | |
| printf("mklinknames.awk: error: %s:%d: unattached extern-sysinfo directive\n", FILENAME, FNR) | "cat 1>&2" | |
| exit 1 | |
| } | |
| split($2, a, "(") | |
| gofnname = a[1] | |
| def = sprintf("grep '^func _%s[ (]' gen-sysinfo.go", cfnname) | |
| # def looks like one of the following: | |
| # func _timegm (*_tm) int64 __asm__("__timegm50") | |
| # func _timegm (*_tm) int64 __asm__("*__timegm50") | |
| # The goal is to extract "__timegm50". | |
| if ((def | getline fndef) > 0 && match(fndef, "__asm__\\(\"\\*?")) { | |
| asmname = substr(fndef, RSTART + RLENGTH) | |
| asmname = substr(asmname, 0, length(asmname) - 2) | |
| printf("//go:linkname %s %s\n", gofnname, asmname) | |
| } else { | |
| # Assume the asm name is the same as the declared C name. | |
| printf("//go:linkname %s %s\n", gofnname, cfnname) | |
| } | |
| } |