[kernel] Add "noreturn" syscall option

The new "noreturn" option tag on syscall methods causes those methods to
be generated with [[noreturn]] / _Noreturn to avoid clang complaining
that other functions marked noreturn, like exit(), because it can't tell
that the syscall never returns.
This commit is contained in:
Justin C. Miller
2022-02-06 21:41:05 -08:00
parent 346c172b32
commit 68a6007fd9
3 changed files with 16 additions and 5 deletions

View File

@@ -147,8 +147,12 @@ for id, scope, method in syscalls.methods:
if extra_argdefs:
first_args += ", uint64_t *sp"
cog.outl(f"""j6_status_t {name} ({", ".join(cxxargdefs)});""")
cog.outl(f"""j6_status_t _syscall_verify_{name} ({first_args}) {{""")
attr = ""
if "noreturn" in method.options:
attr = "[[noreturn]] "
cog.outl(f"""{attr}j6_status_t {name} ({", ".join(cxxargdefs)});""")
cog.outl(f"""{attr}j6_status_t _syscall_verify_{name} ({first_args}) {{""")
for type, arg in extra_argdefs:
cog.outl(f" {type} {arg} = pop_from<{type}>(sp);")
@@ -178,7 +182,10 @@ for id, scope, method in syscalls.methods:
cog.outl(f" if (!{arg}_obj) return j6_err_invalid_arg;")
cog.outl()
cog.outl(f""" return {name}({", ".join(args)});""")
if "noreturn" in method.options:
cog.outl(f""" {name}({", ".join(args)});""")
else:
cog.outl(f""" return {name}({", ".join(args)});""")
cog.outl("}")
cog.outl("\n")
]]]*/

View File

@@ -39,7 +39,11 @@ for id, scope, method in syscalls.methods:
for type, suffix in param.type.c_names(param.options):
args.append(f"{type} {param.name}{suffix}")
cog.outl(f"""j6_status_t j6_{name} ({", ".join(args)});""")
attr = ""
if "noreturn" in method.options:
attr += "_Noreturn "
cog.outl(f"""{attr}j6_status_t j6_{name} ({", ".join(args)});""")
]]]*/
/// [[[end]]]