git: 988e8db3c041 - main - makesyscalls: automate detection of ABI changes
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 22 Nov 2021 22:38:00 UTC
The branch main has been updated by brooks:
URL: https://cgit.FreeBSD.org/src/commit/?id=988e8db3c041e39db0da9fbb0edde9e0e3d53326
commit 988e8db3c041e39db0da9fbb0edde9e0e3d53326
Author: Brooks Davis <brooks@FreeBSD.org>
AuthorDate: 2021-11-22 22:36:58 +0000
Commit: Brooks Davis <brooks@FreeBSD.org>
CommitDate: 2021-11-22 22:36:58 +0000
makesyscalls: automate detection of ABI changes
Use pattern matching including matches of _Contains_*_ argument
annotations to (mostly) determine which system calls require
ABI-specific handling. Automatically treat syscalls as NOPROTO
if no ABI changes are present.
Reviewed by: kevans
---
sys/tools/makesyscalls.lua | 33 ++++++++++++++++++++++++---------
1 file changed, 24 insertions(+), 9 deletions(-)
diff --git a/sys/tools/makesyscalls.lua b/sys/tools/makesyscalls.lua
index e723346f1679..48ad05eb0469 100644
--- a/sys/tools/makesyscalls.lua
+++ b/sys/tools/makesyscalls.lua
@@ -638,9 +638,11 @@ end
local function process_args(args)
local funcargs = {}
+ local changes_abi = false
for arg in args:gmatch("([^,]+)") do
- local abi_change = not isptrtype(arg) or check_abi_changes(arg)
+ local arg_abi_change = check_abi_changes(arg)
+ changes_abi = changes_abi or arg_abi_change
arg = strip_arg_annotations(arg)
@@ -653,6 +655,10 @@ local function process_args(args)
goto out
end
+ -- is64bittype() needs a bare type so check it after argname
+ -- is removed
+ changes_abi = changes_abi or (abi_changes("pair_64bit") and is64bittype(argtype))
+
argtype = argtype:gsub("intptr_t", config["abi_intptr_t"])
argtype = argtype:gsub("semid_t", config["abi_semid_t"])
if isptrtype(argtype) then
@@ -671,7 +677,7 @@ local function process_args(args)
end
-- XX TODO: Forward declarations? See: sysstubfwd in CheriBSD
- if abi_change then
+ if arg_abi_change then
local abi_type_suffix = config["abi_type_suffix"]
argtype = argtype:gsub("(struct [^ ]*)", "%1" ..
abi_type_suffix)
@@ -703,7 +709,7 @@ local function process_args(args)
end
::out::
- return funcargs
+ return funcargs, changes_abi
end
local function handle_noncompat(sysnum, thr_flag, flags, sysflags, rettype,
@@ -1187,25 +1193,31 @@ process_syscall_def = function(line)
end
local funcargs = {}
+ local changes_abi = false
if args ~= nil then
- funcargs = process_args(args)
+ funcargs, changes_abi = process_args(args)
end
+ local noproto = config["abi_flags"] ~= "" and not changes_abi
local argprefix = ''
local funcprefix = ''
if abi_changes("pointer_args") then
for _, v in ipairs(funcargs) do
if isptrtype(v["type"]) then
- -- argalias should be:
- -- COMPAT_PREFIX + ABI Prefix + funcname
- argprefix = config['abi_func_prefix']
- funcprefix = config['abi_func_prefix']
- funcalias = funcprefix .. funcname
+ changes_abi = true
goto ptrfound
end
end
::ptrfound::
end
+ if changes_abi then
+ -- argalias should be:
+ -- COMPAT_PREFIX + ABI Prefix + funcname
+ argprefix = config['abi_func_prefix']
+ funcprefix = config['abi_func_prefix']
+ funcalias = funcprefix .. funcname
+ noproto = false
+ end
if funcname ~= nil then
funcname = funcprefix .. funcname
end
@@ -1232,6 +1244,9 @@ process_syscall_def = function(line)
local ncompatflags = get_mask({"STD", "NODEF", "NOARGS", "NOPROTO",
"NOSTD"})
local compatflags = get_mask_pat("COMPAT.*")
+ if noproto then
+ flags = flags | known_flags["NOPROTO"];
+ end
if flags & known_flags["OBSOL"] ~= 0 then
handle_obsol(sysnum, funcname, funcomment)
elseif flags & known_flags["RESERVED"] ~= 0 then