git: 988e8db3c041 - main - makesyscalls: automate detection of ABI changes

From: Brooks Davis <brooks_at_FreeBSD.org>
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