| #!/usr/bin/awk -f | 
 |  | 
 | #===-- generate_netbsd_syscalls.awk ----------------------------------------===# | 
 | # | 
 | # Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
 | # See https://llvm.org/LICENSE.txt for license information. | 
 | # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
 | # | 
 | #===------------------------------------------------------------------------===# | 
 | # | 
 | # This file is a generator of: | 
 | #  - include/sanitizer/netbsd_syscall_hooks.h | 
 | #  - lib/sanitizer_common/sanitizer_syscalls_netbsd.inc | 
 | # | 
 | # This script accepts on the input syscalls.master by default located in the | 
 | # /usr/src/sys/kern/syscalls.master path in the NetBSD distribution. | 
 | # | 
 | # This script shall be executed only on the newest NetBSD version. | 
 | # This script will emit compat code for the older releases. | 
 | # | 
 | # NetBSD minimal version supported 9.0. | 
 | # NetBSD current version supported 9.99.30. | 
 | # | 
 | #===------------------------------------------------------------------------===# | 
 |  | 
 | BEGIN { | 
 |   # hardcode the script name | 
 |   script_name = "generate_netbsd_syscalls.awk" | 
 |   outputh = "../include/sanitizer/netbsd_syscall_hooks.h" | 
 |   outputinc = "../lib/sanitizer_common/sanitizer_syscalls_netbsd.inc" | 
 |  | 
 |   # assert that we are in the directory with scripts | 
 |   in_utils = system("test -f " script_name " && exit 1 || exit 0") | 
 |   if (in_utils == 0) { | 
 |     usage() | 
 |   } | 
 |  | 
 |   # assert 1 argument passed | 
 |   if (ARGC != 2) { | 
 |     usage() | 
 |   } | 
 |  | 
 |   # assert argument is a valid file path to syscall.master | 
 |   if (system("test -f " ARGV[1]) != 0) { | 
 |     usage() | 
 |   } | 
 |  | 
 |   # sanity check that the path ends with "syscall.master" | 
 |   if (ARGV[1] !~ /syscalls\.master$/) { | 
 |     usage() | 
 |   } | 
 |  | 
 |   # accept overloading CLANGFORMAT from environment | 
 |   clangformat = "clang-format" | 
 |   if ("CLANGFORMAT" in ENVIRON) { | 
 |     clangformat = ENVIRON["CLANGFORMAT"] | 
 |   } | 
 |  | 
 |   # parsing specific symbols | 
 |   parsingheader=1 | 
 |  | 
 |   parsedsyscalls=0 | 
 |  | 
 |   # Hardcoded in algorithm | 
 |   SYS_MAXSYSARGS=8 | 
 | } | 
 |  | 
 | # Parse the RCS ID from syscall.master | 
 | parsingheader == 1 && NR == 1 { | 
 |   if (match($0, /\$[^$]+\$/)) { | 
 |     # trim initial 'NetBSD: ' and trailing ' $' | 
 |     syscallmasterversion = substr($0, RSTART + 9, RLENGTH - 11) | 
 |   } else { | 
 |     # wrong file? | 
 |     usage() | 
 |   } | 
 | } | 
 |  | 
 | # skip the following lines | 
 | #  - empty | 
 | NF == 0 { | 
 |   next | 
 | } | 
 | #  - comment | 
 | $1 == ";" { | 
 |   next | 
 | } | 
 |  | 
 | # separator between the header and table with syscalls | 
 | $0 == "%%" { | 
 |   parsingheader = 0 | 
 |   next | 
 | } | 
 |  | 
 | # preserve 'if/elif/else/endif' C preprocessor as-is | 
 | parsingheader == 0 && $0 ~ /^#/ { | 
 |   if (parsedsyscalls in ifelifelseendif) { | 
 |     ifelifelseendif[parsedsyscalls] = ifelifelseendif[parsedsyscalls] "\n" $0 | 
 |   } else { | 
 |     ifelifelseendif[parsedsyscalls] = $0 | 
 |   } | 
 |   next | 
 | } | 
 |  | 
 | # parsing of syscall definitions | 
 | parsingheader == 0 && $1 ~ /^[0-9]+$/ { | 
 |   # first join multiple lines into single one | 
 |   while (sub(/\\$/, "")) { | 
 |     getline line | 
 |     $0 = $0 "" line | 
 |   } | 
 |  | 
 |   # Skip unwanted syscalls | 
 |   skip=0 | 
 |   if ($0 ~ /OBSOL/ || $0 ~ /EXCL/ || $0 ~ /UNIMPL/) { | 
 |     skip=1 | 
 |   } | 
 |  | 
 |   # Compose the syscall name | 
 |   #  - compat? | 
 |   compat="" | 
 |   if (match($0, /COMPAT_[0-9]+/)) { | 
 |     compat = tolower(substr($0, RSTART, RLENGTH)) | 
 |   } | 
 |   # - alias name? | 
 |   alias="" | 
 |   if ($(NF) != "}" && !skip) { | 
 |     alias = alias "" $(NF) | 
 |   } | 
 |   # - compat version? | 
 |   compatver="" | 
 |   if (match($0, /\|[0-9]+\|/)) { | 
 |     compatver = tolower(substr($0, RSTART + 1, RLENGTH - 2)) | 
 |   } | 
 |   # - basename? | 
 |   basename="" | 
 |   if (skip) { | 
 |     basename = $1 | 
 |   } else { | 
 |     if (match($0, /\|[_a-z0-9]+\(/)) { | 
 |       basename = tolower(substr($0, RSTART + 1, RLENGTH - 2)) | 
 |     } | 
 |   } | 
 |  | 
 |   syscallname="" | 
 |  | 
 |   if (skip) { | 
 |     syscallname= syscallname "$" | 
 |   } | 
 |  | 
 |   if (length(compat) > 0) { | 
 |     syscallname = syscallname "" compat "_" | 
 |   } | 
 |   if (length(alias) > 0) { | 
 |     syscallname = syscallname "" alias | 
 |   } else { | 
 |     if (length(compatver) > 0) { | 
 |       syscallname = syscallname "__" basename "" compatver | 
 |     } else { | 
 |       syscallname = syscallname "" basename | 
 |     } | 
 |   } | 
 |  | 
 |   # Store the syscallname | 
 |   syscalls[parsedsyscalls]=syscallname | 
 |  | 
 |   # Extract syscall arguments | 
 |   if (match($0, /\([^)]+\)/)) { | 
 |     args = substr($0, RSTART + 1, RLENGTH - 2) | 
 |  | 
 |     if (args == "void") { | 
 |       syscallargs[parsedsyscalls] = "void" | 
 |       syscallfullargs[parsedsyscalls] = "void" | 
 |     } else { | 
 |       # Normalize 'type * argument' to 'type *argument' | 
 |       gsub("\\*[ \t]+", "*", args) | 
 |  | 
 |       n = split(args, a, ",") | 
 |  | 
 |       # Handle the first argument | 
 |       match(a[1], /[*_a-z0-9\[\]]+$/) | 
 |       syscallfullargs[parsedsyscalls] = substr(a[1], RSTART) "_" | 
 |  | 
 |       gsub(".+[ *]", "", a[1]) | 
 |       syscallargs[parsedsyscalls] = a[1] | 
 |  | 
 |       # Handle the rest of arguments | 
 |       for (i = 2; i <= n; i++) { | 
 |         match(a[i], /[*_a-zA-Z0-9\[\]]+$/) | 
 |         fs = substr(a[i], RSTART) | 
 |         if (fs ~ /\[/) { | 
 |           sub(/\[/, "_[", fs) | 
 |         } else { | 
 |           fs = fs "_" | 
 |         } | 
 |         syscallfullargs[parsedsyscalls] = syscallfullargs[parsedsyscalls] "$" fs | 
 | 	gsub(".+[ *]", "", a[i]) | 
 |         syscallargs[parsedsyscalls] = syscallargs[parsedsyscalls] "$" a[i] | 
 |       } | 
 |  | 
 |       # Handle array arguments for syscall(2) and __syscall(2) | 
 |       nargs = "arg0$arg1$arg2$arg3$arg4$arg5$arg6$arg7" | 
 |       gsub(/args\[SYS_MAXSYSARGS\]/, nargs, syscallargs[parsedsyscalls]) | 
 |     } | 
 |   } | 
 |  | 
 |   parsedsyscalls++ | 
 |  | 
 |   # Done with this line | 
 |   next | 
 | } | 
 |  | 
 |  | 
 | END { | 
 |   # empty file? | 
 |   if (NR < 1 && !abnormal_exit) { | 
 |     usage() | 
 |   } | 
 |  | 
 |   # Handle abnormal exit | 
 |   if (abnormal_exit) { | 
 |     exit(abnormal_exit) | 
 |   } | 
 |  | 
 |   # Generate sanitizer_syscalls_netbsd.inc | 
 |  | 
 |   # open pipe | 
 |   cmd = clangformat " > " outputh | 
 |  | 
 |   pcmd("//===-- netbsd_syscall_hooks.h --------------------------------------------===//") | 
 |   pcmd("//") | 
 |   pcmd("// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.") | 
 |   pcmd("// See https://llvm.org/LICENSE.txt for license information.") | 
 |   pcmd("// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception") | 
 |   pcmd("//") | 
 |   pcmd("//===----------------------------------------------------------------------===//") | 
 |   pcmd("//") | 
 |   pcmd("// This file is a part of public sanitizer interface.") | 
 |   pcmd("//") | 
 |   pcmd("// System call handlers.") | 
 |   pcmd("//") | 
 |   pcmd("// Interface methods declared in this header implement pre- and post- syscall") | 
 |   pcmd("// actions for the active sanitizer.") | 
 |   pcmd("// Usage:") | 
 |   pcmd("//   __sanitizer_syscall_pre_getfoo(...args...);") | 
 |   pcmd("//   long long res = syscall(SYS_getfoo, ...args...);") | 
 |   pcmd("//   __sanitizer_syscall_post_getfoo(res, ...args...);") | 
 |   pcmd("//") | 
 |   pcmd("// DO NOT EDIT! THIS FILE HAS BEEN GENERATED!") | 
 |   pcmd("//") | 
 |   pcmd("// Generated with: " script_name) | 
 |   pcmd("// Generated date: " strftime("%F")) | 
 |   pcmd("// Generated from: " syscallmasterversion) | 
 |   pcmd("//") | 
 |   pcmd("//===----------------------------------------------------------------------===//") | 
 |   pcmd("#ifndef SANITIZER_NETBSD_SYSCALL_HOOKS_H") | 
 |   pcmd("#define SANITIZER_NETBSD_SYSCALL_HOOKS_H") | 
 |   pcmd("") | 
 |  | 
 |   for (i = 0; i < parsedsyscalls; i++) { | 
 |  | 
 |     if (i in ifelifelseendif) { | 
 |       pcmd(ifelifelseendif[i]) | 
 |     } | 
 |  | 
 |     sn = syscalls[i] | 
 |  | 
 |     if (sn ~ /^\$/) { | 
 |       pcmd("/* syscall " substr(sn,2) " has been skipped */") | 
 |       continue | 
 |     } | 
 |  | 
 |     inargs = "" | 
 |  | 
 |     if (syscallargs[i] != "void") { | 
 |       inargs = syscallargs[i] | 
 |       gsub(/\$/, ", ", inargs) | 
 |     } | 
 |  | 
 |     outargs = "" | 
 |  | 
 |     if (syscallargs[i] != "void") { | 
 |       outargs = "(long long)(" syscallargs[i] ")" | 
 |       gsub(/\$/, "), (long long)(", outargs) | 
 |     } | 
 |  | 
 |     pcmd("#define __sanitizer_syscall_pre_" sn "(" inargs ") \\") | 
 |     pcmd("  __sanitizer_syscall_pre_impl_" sn "(" outargs ")") | 
 |  | 
 |     if (inargs == "") { | 
 |       inargs = "res" | 
 |     } else { | 
 |       inargs = "res, " inargs | 
 |     } | 
 |  | 
 |     if (outargs == "") { | 
 |       outargs = "res" | 
 |     } else { | 
 |       outargs = "res, " outargs | 
 |     } | 
 |  | 
 |     pcmd("#define __sanitizer_syscall_post_" sn "(" inargs ") \\") | 
 |     pcmd("  __sanitizer_syscall_post_impl_" sn "(" outargs ")") | 
 |   } | 
 |  | 
 |   pcmd("") | 
 |   pcmd("/* Compat with older releases */") | 
 |   pcmd("#define __sanitizer_syscall_pre_getvfsstat __sanitizer_syscall_pre_compat_90_getvfsstat") | 
 |   pcmd("#define __sanitizer_syscall_post_getvfsstat __sanitizer_syscall_post_compat_90_getvfsstat") | 
 |   pcmd("") | 
 |   pcmd("#define __sanitizer_syscall_pre_statvfs1 __sanitizer_syscall_pre_compat_90_statvfs1") | 
 |   pcmd("#define __sanitizer_syscall_post_statvfs1 __sanitizer_syscall_post_compat_90_statvfs1") | 
 |   pcmd("") | 
 |   pcmd("#define __sanitizer_syscall_pre_fstatvfs1 __sanitizer_syscall_pre_compat_90_fstatvfs1") | 
 |   pcmd("#define __sanitizer_syscall_post_fstatvfs1 __sanitizer_syscall_post_compat_90_fstatvfs1") | 
 |   pcmd("") | 
 |   pcmd("#define __sanitizer_syscall_pre___fhstatvfs140 __sanitizer_syscall_pre_compat_90_fhstatvfs1") | 
 |   pcmd("#define __sanitizer_syscall_post___fhstatvfs140 __sanitizer_syscall_post_compat_90_fhstatvfs1") | 
 |  | 
 |   pcmd("") | 
 |   pcmd("#ifdef __cplusplus") | 
 |   pcmd("extern \"C\" {") | 
 |   pcmd("#endif") | 
 |   pcmd("") | 
 |   pcmd("// Private declarations. Do not call directly from user code. Use macros above.") | 
 |   pcmd("") | 
 |   pcmd("// DO NOT EDIT! THIS FILE HAS BEEN GENERATED!") | 
 |   pcmd("") | 
 |  | 
 |   for (i = 0; i < parsedsyscalls; i++) { | 
 |  | 
 |     if (i in ifelifelseendif) { | 
 |       pcmd(ifelifelseendif[i]) | 
 |     } | 
 |  | 
 |     sn = syscalls[i] | 
 |  | 
 |     if (sn ~ /^\$/) { | 
 |       pcmd("/* syscall " substr(sn,2) " has been skipped */") | 
 |       continue | 
 |     } | 
 |  | 
 |     preargs = syscallargs[i] | 
 |  | 
 |     if (preargs != "void") { | 
 |       preargs = "long long " preargs | 
 |       gsub(/\$/, ", long long ", preargs) | 
 |     } | 
 |  | 
 |     if (preargs == "void") { | 
 |       postargs = "long long res" | 
 |     } else { | 
 |       postargs = "long long res, " preargs | 
 |     } | 
 |  | 
 |     pcmd("void __sanitizer_syscall_pre_impl_" sn "(" preargs ");") | 
 |     pcmd("void __sanitizer_syscall_post_impl_" sn "(" postargs ");") | 
 |   } | 
 |  | 
 |   pcmd("") | 
 |   pcmd("#ifdef __cplusplus") | 
 |   pcmd("} // extern \"C\"") | 
 |   pcmd("#endif") | 
 |  | 
 |   pcmd("") | 
 |   pcmd("// DO NOT EDIT! THIS FILE HAS BEEN GENERATED!") | 
 |   pcmd("") | 
 |  | 
 |   pcmd("#endif  // SANITIZER_NETBSD_SYSCALL_HOOKS_H") | 
 |  | 
 |   close(cmd) | 
 |  | 
 |   # Generate sanitizer_syscalls_netbsd.inc | 
 |  | 
 |   # open pipe | 
 |   cmd = clangformat " > " outputinc | 
 |  | 
 |   pcmd("//===-- sanitizer_syscalls_netbsd.inc ---------------------------*- C++ -*-===//") | 
 |   pcmd("//") | 
 |   pcmd("// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.") | 
 |   pcmd("// See https://llvm.org/LICENSE.txt for license information.") | 
 |   pcmd("// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception") | 
 |   pcmd("//") | 
 |   pcmd("//===----------------------------------------------------------------------===//") | 
 |   pcmd("//") | 
 |   pcmd("// Common syscalls handlers for tools like AddressSanitizer,") | 
 |   pcmd("// ThreadSanitizer, MemorySanitizer, etc.") | 
 |   pcmd("//") | 
 |   pcmd("// This file should be included into the tool's interceptor file,") | 
 |   pcmd("// which has to define it's own macros:") | 
 |   pcmd("//   COMMON_SYSCALL_PRE_READ_RANGE") | 
 |   pcmd("//          Called in prehook for regions that will be read by the kernel and") | 
 |   pcmd("//          must be initialized.") | 
 |   pcmd("//   COMMON_SYSCALL_PRE_WRITE_RANGE") | 
 |   pcmd("//          Called in prehook for regions that will be written to by the kernel") | 
 |   pcmd("//          and must be addressable. The actual write range may be smaller than") | 
 |   pcmd("//          reported in the prehook. See POST_WRITE_RANGE.") | 
 |   pcmd("//   COMMON_SYSCALL_POST_READ_RANGE") | 
 |   pcmd("//          Called in posthook for regions that were read by the kernel. Does") | 
 |   pcmd("//          not make much sense.") | 
 |   pcmd("//   COMMON_SYSCALL_POST_WRITE_RANGE") | 
 |   pcmd("//          Called in posthook for regions that were written to by the kernel") | 
 |   pcmd("//          and are now initialized.") | 
 |   pcmd("//   COMMON_SYSCALL_ACQUIRE(addr)") | 
 |   pcmd("//          Acquire memory visibility from addr.") | 
 |   pcmd("//   COMMON_SYSCALL_RELEASE(addr)") | 
 |   pcmd("//          Release memory visibility to addr.") | 
 |   pcmd("//   COMMON_SYSCALL_FD_CLOSE(fd)") | 
 |   pcmd("//          Called before closing file descriptor fd.") | 
 |   pcmd("//   COMMON_SYSCALL_FD_ACQUIRE(fd)") | 
 |   pcmd("//          Acquire memory visibility from fd.") | 
 |   pcmd("//   COMMON_SYSCALL_FD_RELEASE(fd)") | 
 |   pcmd("//          Release memory visibility to fd.") | 
 |   pcmd("//   COMMON_SYSCALL_PRE_FORK()") | 
 |   pcmd("//          Called before fork syscall.") | 
 |   pcmd("//   COMMON_SYSCALL_POST_FORK(long long res)") | 
 |   pcmd("//          Called after fork syscall.") | 
 |   pcmd("//") | 
 |   pcmd("// DO NOT EDIT! THIS FILE HAS BEEN GENERATED!") | 
 |   pcmd("//") | 
 |   pcmd("// Generated with: " script_name) | 
 |   pcmd("// Generated date: " strftime("%F")) | 
 |   pcmd("// Generated from: " syscallmasterversion) | 
 |   pcmd("//") | 
 |   pcmd("//===----------------------------------------------------------------------===//") | 
 |   pcmd("") | 
 |   pcmd("#include \"sanitizer_platform.h\"") | 
 |   pcmd("#if SANITIZER_NETBSD") | 
 |   pcmd("") | 
 |   pcmd("#include \"sanitizer_libc.h\"") | 
 |   pcmd("") | 
 |   pcmd("#define PRE_SYSCALL(name)                                                      \\") | 
 |   pcmd("  SANITIZER_INTERFACE_ATTRIBUTE void __sanitizer_syscall_pre_impl_##name") | 
 |   pcmd("#define PRE_READ(p, s) COMMON_SYSCALL_PRE_READ_RANGE(p, s)") | 
 |   pcmd("#define PRE_WRITE(p, s) COMMON_SYSCALL_PRE_WRITE_RANGE(p, s)") | 
 |   pcmd("") | 
 |   pcmd("#define POST_SYSCALL(name)                                                     \\") | 
 |   pcmd("  SANITIZER_INTERFACE_ATTRIBUTE void __sanitizer_syscall_post_impl_##name") | 
 |   pcmd("#define POST_READ(p, s) COMMON_SYSCALL_POST_READ_RANGE(p, s)") | 
 |   pcmd("#define POST_WRITE(p, s) COMMON_SYSCALL_POST_WRITE_RANGE(p, s)") | 
 |   pcmd("") | 
 |   pcmd("#ifndef COMMON_SYSCALL_ACQUIRE") | 
 |   pcmd("# define COMMON_SYSCALL_ACQUIRE(addr) ((void)(addr))") | 
 |   pcmd("#endif") | 
 |   pcmd("") | 
 |   pcmd("#ifndef COMMON_SYSCALL_RELEASE") | 
 |   pcmd("# define COMMON_SYSCALL_RELEASE(addr) ((void)(addr))") | 
 |   pcmd("#endif") | 
 |   pcmd("") | 
 |   pcmd("#ifndef COMMON_SYSCALL_FD_CLOSE") | 
 |   pcmd("# define COMMON_SYSCALL_FD_CLOSE(fd) ((void)(fd))") | 
 |   pcmd("#endif") | 
 |   pcmd("") | 
 |   pcmd("#ifndef COMMON_SYSCALL_FD_ACQUIRE") | 
 |   pcmd("# define COMMON_SYSCALL_FD_ACQUIRE(fd) ((void)(fd))") | 
 |   pcmd("#endif") | 
 |   pcmd("") | 
 |   pcmd("#ifndef COMMON_SYSCALL_FD_RELEASE") | 
 |   pcmd("# define COMMON_SYSCALL_FD_RELEASE(fd) ((void)(fd))") | 
 |   pcmd("#endif") | 
 |   pcmd("") | 
 |   pcmd("#ifndef COMMON_SYSCALL_PRE_FORK") | 
 |   pcmd("# define COMMON_SYSCALL_PRE_FORK() {}") | 
 |   pcmd("#endif") | 
 |   pcmd("") | 
 |   pcmd("#ifndef COMMON_SYSCALL_POST_FORK") | 
 |   pcmd("# define COMMON_SYSCALL_POST_FORK(res) {}") | 
 |   pcmd("#endif") | 
 |   pcmd("") | 
 |   pcmd("// FIXME: do some kind of PRE_READ for all syscall arguments (int(s) and such).") | 
 |   pcmd("") | 
 |   pcmd("extern \"C\" {") | 
 |   pcmd("#define SYS_MAXSYSARGS " SYS_MAXSYSARGS) | 
 |  | 
 |   for (i = 0; i < parsedsyscalls; i++) { | 
 |  | 
 |     if (i in ifelifelseendif) { | 
 |       pcmd(ifelifelseendif[i]) | 
 |     } | 
 |  | 
 |     sn = syscalls[i] | 
 |  | 
 |     if (sn ~ /^\$/) { | 
 |       pcmd("/* syscall " substr(sn,2) " has been skipped */") | 
 |       continue | 
 |     } | 
 |  | 
 |     preargs = syscallfullargs[i] | 
 |  | 
 |     if (preargs != "void") { | 
 |       preargs = "long long " preargs | 
 |       gsub(/\$/, ", long long ", preargs) | 
 |       gsub(/long long \*/, "void *", preargs) | 
 |     } | 
 |  | 
 |     if (preargs == "void") { | 
 |       postargs = "long long res" | 
 |     } else { | 
 |       postargs = "long long res, " preargs | 
 |     } | 
 |  | 
 |     pcmd("PRE_SYSCALL(" sn ")(" preargs ")") | 
 |     pcmd("{") | 
 |     syscall_body(sn, "pre") | 
 |     pcmd("}") | 
 |  | 
 |     pcmd("POST_SYSCALL(" sn ")(" postargs ")") | 
 |     pcmd("{") | 
 |     syscall_body(sn, "post") | 
 |     pcmd("}") | 
 |   } | 
 |  | 
 |   pcmd("#undef SYS_MAXSYSARGS") | 
 |   pcmd("}  // extern \"C\"") | 
 |   pcmd("") | 
 |   pcmd("#undef PRE_SYSCALL") | 
 |   pcmd("#undef PRE_READ") | 
 |   pcmd("#undef PRE_WRITE") | 
 |   pcmd("#undef POST_SYSCALL") | 
 |   pcmd("#undef POST_READ") | 
 |   pcmd("#undef POST_WRITE") | 
 |   pcmd("") | 
 |   pcmd("#endif  // SANITIZER_NETBSD") | 
 |  | 
 |   close(cmd) | 
 |  | 
 |   # Hack for preprocessed code | 
 |   system("sed -i 's,^ \\([^ ]\\),  \\1,' " outputinc) | 
 | } | 
 |  | 
 | function usage() | 
 | { | 
 |   print "Usage: " script_name " syscalls.master" | 
 |   abnormal_exit = 1 | 
 |   exit 1 | 
 | } | 
 |  | 
 | function pcmd(string) | 
 | { | 
 |   print string | cmd | 
 | } | 
 |  | 
 | function syscall_body(syscall, mode) | 
 | { | 
 |   # Hardcode sanitizing rules here | 
 |   # These syscalls don't change often so they are hand coded | 
 |   if (syscall == "syscall") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "exit") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "fork") { | 
 |     if (mode == "pre") { | 
 |       pcmd("COMMON_SYSCALL_PRE_FORK();") | 
 |     } else { | 
 |       pcmd("COMMON_SYSCALL_POST_FORK(res);") | 
 |     } | 
 |   } else if (syscall == "read") { | 
 |     if (mode == "pre") { | 
 |       pcmd("if (buf_) {") | 
 |       pcmd("  PRE_WRITE(buf_, nbyte_);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("if (res > 0) {") | 
 |       pcmd("  POST_WRITE(buf_, res);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "write") { | 
 |     if (mode == "pre") { | 
 |       pcmd("if (buf_) {") | 
 |       pcmd("  PRE_READ(buf_, nbyte_);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("if (res > 0) {") | 
 |       pcmd("  POST_READ(buf_, res);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "open") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("if (res > 0) {") | 
 |       pcmd("  const char *path = (const char *)path_;") | 
 |       pcmd("  if (path) {") | 
 |       pcmd("    POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "close") { | 
 |     if (mode == "pre") { | 
 |       pcmd("COMMON_SYSCALL_FD_CLOSE((int)fd_);") | 
 |     } else { | 
 |       pcmd("/* Nothing to do */") | 
 |     } | 
 |   } else if (syscall == "compat_50_wait4") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_43_ocreat") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "link") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("const char *link = (const char *)link_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |       pcmd("if (link) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(link) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  const char *path = (const char *)path_;") | 
 |       pcmd("  const char *link = (const char *)link_;") | 
 |       pcmd("  if (path) {") | 
 |       pcmd("    POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("  if (link) {") | 
 |       pcmd("    POST_READ(path, __sanitizer::internal_strlen(link) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "unlink") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  const char *path = (const char *)path_;") | 
 |       pcmd("  if (path) {") | 
 |       pcmd("    POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "chdir") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  const char *path = (const char *)path_;") | 
 |       pcmd("  if (path) {") | 
 |       pcmd("    POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "fchdir") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "compat_50_mknod") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "chmod") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  const char *path = (const char *)path_;") | 
 |       pcmd("  if (path) {") | 
 |       pcmd("    POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "chown") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  const char *path = (const char *)path_;") | 
 |       pcmd("  if (path) {") | 
 |       pcmd("    POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "break") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "compat_20_getfsstat") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_43_olseek") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "getpid") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "compat_40_mount") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "unmount") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  const char *path = (const char *)path_;") | 
 |       pcmd("  if (path) {") | 
 |       pcmd("    POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "setuid") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "getuid") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "geteuid") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "ptrace") { | 
 |     if (mode == "pre") { | 
 |       pcmd("if (req_ == ptrace_pt_io) {") | 
 |       pcmd("  struct __sanitizer_ptrace_io_desc *addr = (struct __sanitizer_ptrace_io_desc *)addr_;") | 
 |       pcmd("  PRE_READ(addr, struct_ptrace_ptrace_io_desc_struct_sz);") | 
 |       pcmd("  if (addr->piod_op == ptrace_piod_write_d || addr->piod_op == ptrace_piod_write_i) {") | 
 |       pcmd("    PRE_READ(addr->piod_addr, addr->piod_len);") | 
 |       pcmd("  }") | 
 |       pcmd("  if (addr->piod_op == ptrace_piod_read_d || addr->piod_op == ptrace_piod_read_i || addr->piod_op == ptrace_piod_read_auxv) {") | 
 |       pcmd("    PRE_WRITE(addr->piod_addr, addr->piod_len);") | 
 |       pcmd("  }") | 
 |       pcmd("} else if (req_ == ptrace_pt_lwpinfo) {") | 
 |       pcmd("  struct __sanitizer_ptrace_lwpinfo *addr = (struct __sanitizer_ptrace_lwpinfo *)addr_;") | 
 |       pcmd("  PRE_READ(&addr->pl_lwpid, sizeof(__sanitizer_lwpid_t));") | 
 |       pcmd("  PRE_WRITE(addr, struct_ptrace_ptrace_lwpinfo_struct_sz);") | 
 |       pcmd("} else if (req_ == ptrace_pt_set_event_mask) {") | 
 |       pcmd("  PRE_READ(addr_, struct_ptrace_ptrace_event_struct_sz);") | 
 |       pcmd("} else if (req_ == ptrace_pt_get_event_mask) {") | 
 |       pcmd("  PRE_WRITE(addr_, struct_ptrace_ptrace_event_struct_sz);") | 
 |       pcmd("} else if (req_ == ptrace_pt_set_siginfo) {") | 
 |       pcmd("  PRE_READ(addr_, struct_ptrace_ptrace_siginfo_struct_sz);") | 
 |       pcmd("} else if (req_ == ptrace_pt_get_siginfo) {") | 
 |       pcmd("  PRE_WRITE(addr_, struct_ptrace_ptrace_siginfo_struct_sz);") | 
 |       pcmd("} else if (req_ == ptrace_pt_lwpstatus) {") | 
 |       pcmd("  struct __sanitizer_ptrace_lwpstatus *addr = (struct __sanitizer_ptrace_lwpstatus *)addr_;") | 
 |       pcmd("  PRE_READ(&addr->pl_lwpid, sizeof(__sanitizer_lwpid_t));") | 
 |       pcmd("  PRE_WRITE(addr, struct_ptrace_ptrace_lwpstatus_struct_sz);") | 
 |       pcmd("} else if (req_ == ptrace_pt_lwpnext) {") | 
 |       pcmd("  struct __sanitizer_ptrace_lwpstatus *addr = (struct __sanitizer_ptrace_lwpstatus *)addr_;") | 
 |       pcmd("  PRE_READ(&addr->pl_lwpid, sizeof(__sanitizer_lwpid_t));") | 
 |       pcmd("  PRE_WRITE(addr, struct_ptrace_ptrace_lwpstatus_struct_sz);") | 
 |       pcmd("} else if (req_ == ptrace_pt_setregs) {") | 
 |       pcmd("  PRE_READ(addr_, struct_ptrace_reg_struct_sz);") | 
 |       pcmd("} else if (req_ == ptrace_pt_getregs) {") | 
 |       pcmd("  PRE_WRITE(addr_, struct_ptrace_reg_struct_sz);") | 
 |       pcmd("} else if (req_ == ptrace_pt_setfpregs) {") | 
 |       pcmd("  PRE_READ(addr_, struct_ptrace_fpreg_struct_sz);") | 
 |       pcmd("} else if (req_ == ptrace_pt_getfpregs) {") | 
 |       pcmd("  PRE_WRITE(addr_, struct_ptrace_fpreg_struct_sz);") | 
 |       pcmd("} else if (req_ == ptrace_pt_setdbregs) {") | 
 |       pcmd("  PRE_READ(addr_, struct_ptrace_dbreg_struct_sz);") | 
 |       pcmd("} else if (req_ == ptrace_pt_getdbregs) {") | 
 |       pcmd("  PRE_WRITE(addr_, struct_ptrace_dbreg_struct_sz);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  if (req_ == ptrace_pt_io) {") | 
 |       pcmd("    struct __sanitizer_ptrace_io_desc *addr = (struct __sanitizer_ptrace_io_desc *)addr_;") | 
 |       pcmd("    POST_READ(addr, struct_ptrace_ptrace_io_desc_struct_sz);") | 
 |       pcmd("    if (addr->piod_op == ptrace_piod_write_d || addr->piod_op == ptrace_piod_write_i) {") | 
 |       pcmd("      POST_READ(addr->piod_addr, addr->piod_len);") | 
 |       pcmd("    }") | 
 |       pcmd("    if (addr->piod_op == ptrace_piod_read_d || addr->piod_op == ptrace_piod_read_i || addr->piod_op == ptrace_piod_read_auxv) {") | 
 |       pcmd("      POST_WRITE(addr->piod_addr, addr->piod_len);") | 
 |       pcmd("    }") | 
 |       pcmd("  } else if (req_ == ptrace_pt_lwpinfo) {") | 
 |       pcmd("    struct __sanitizer_ptrace_lwpinfo *addr = (struct __sanitizer_ptrace_lwpinfo *)addr_;") | 
 |       pcmd("    POST_READ(&addr->pl_lwpid, sizeof(__sanitizer_lwpid_t));") | 
 |       pcmd("    POST_WRITE(addr, struct_ptrace_ptrace_lwpinfo_struct_sz);") | 
 |       pcmd("  } else if (req_ == ptrace_pt_set_event_mask) {") | 
 |       pcmd("    POST_READ(addr_, struct_ptrace_ptrace_event_struct_sz);") | 
 |       pcmd("  } else if (req_ == ptrace_pt_get_event_mask) {") | 
 |       pcmd("    POST_WRITE(addr_, struct_ptrace_ptrace_event_struct_sz);") | 
 |       pcmd("  } else if (req_ == ptrace_pt_set_siginfo) {") | 
 |       pcmd("    POST_READ(addr_, struct_ptrace_ptrace_siginfo_struct_sz);") | 
 |       pcmd("  } else if (req_ == ptrace_pt_get_siginfo) {") | 
 |       pcmd("    POST_WRITE(addr_, struct_ptrace_ptrace_siginfo_struct_sz);") | 
 |       pcmd("  } else if (req_ == ptrace_pt_lwpstatus) {") | 
 |       pcmd("    struct __sanitizer_ptrace_lwpstatus *addr = (struct __sanitizer_ptrace_lwpstatus *)addr_;") | 
 |       pcmd("    POST_READ(&addr->pl_lwpid, sizeof(__sanitizer_lwpid_t));") | 
 |       pcmd("    POST_WRITE(addr, struct_ptrace_ptrace_lwpstatus_struct_sz);") | 
 |       pcmd("  } else if (req_ == ptrace_pt_lwpnext) {") | 
 |       pcmd("    struct __sanitizer_ptrace_lwpstatus *addr = (struct __sanitizer_ptrace_lwpstatus *)addr_;") | 
 |       pcmd("    POST_READ(&addr->pl_lwpid, sizeof(__sanitizer_lwpid_t));") | 
 |       pcmd("    POST_WRITE(addr, struct_ptrace_ptrace_lwpstatus_struct_sz);") | 
 |       pcmd("  } else if (req_ == ptrace_pt_setregs) {") | 
 |       pcmd("    POST_READ(addr_, struct_ptrace_reg_struct_sz);") | 
 |       pcmd("  } else if (req_ == ptrace_pt_getregs) {") | 
 |       pcmd("    POST_WRITE(addr_, struct_ptrace_reg_struct_sz);") | 
 |       pcmd("  } else if (req_ == ptrace_pt_setfpregs) {") | 
 |       pcmd("    POST_READ(addr_, struct_ptrace_fpreg_struct_sz);") | 
 |       pcmd("  } else if (req_ == ptrace_pt_getfpregs) {") | 
 |       pcmd("    POST_WRITE(addr_, struct_ptrace_fpreg_struct_sz);") | 
 |       pcmd("  } else if (req_ == ptrace_pt_setdbregs) {") | 
 |       pcmd("    POST_READ(addr_, struct_ptrace_dbreg_struct_sz);") | 
 |       pcmd("  } else if (req_ == ptrace_pt_getdbregs) {") | 
 |       pcmd("    POST_WRITE(addr_, struct_ptrace_dbreg_struct_sz);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "recvmsg") { | 
 |     if (mode == "pre") { | 
 |       pcmd("PRE_WRITE(msg_, sizeof(__sanitizer_msghdr));") | 
 |     } else { | 
 |       pcmd("if (res > 0) {") | 
 |       pcmd("  POST_WRITE(msg_, sizeof(__sanitizer_msghdr));") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "sendmsg") { | 
 |     if (mode == "pre") { | 
 |       pcmd("PRE_READ(msg_, sizeof(__sanitizer_msghdr));") | 
 |     } else { | 
 |       pcmd("if (res > 0) {") | 
 |       pcmd("  POST_READ(msg_, sizeof(__sanitizer_msghdr));") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "recvfrom") { | 
 |     if (mode == "pre") { | 
 |       pcmd("PRE_WRITE(buf_, len_);") | 
 |       pcmd("PRE_WRITE(from_, struct_sockaddr_sz);") | 
 |       pcmd("PRE_WRITE(fromlenaddr_, sizeof(__sanitizer_socklen_t));") | 
 |     } else { | 
 |       pcmd("if (res >= 0) {") | 
 |       pcmd("  POST_WRITE(buf_, res);") | 
 |       pcmd("  POST_WRITE(from_, struct_sockaddr_sz);") | 
 |       pcmd("  POST_WRITE(fromlenaddr_, sizeof(__sanitizer_socklen_t));") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "accept") { | 
 |     if (mode == "pre") { | 
 |       pcmd("PRE_WRITE(name_, struct_sockaddr_sz);") | 
 |       pcmd("PRE_WRITE(anamelen_, sizeof(__sanitizer_socklen_t));") | 
 |     } else { | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  POST_WRITE(name_, struct_sockaddr_sz);") | 
 |       pcmd("  POST_WRITE(anamelen_, sizeof(__sanitizer_socklen_t));") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "getpeername") { | 
 |     if (mode == "pre") { | 
 |       pcmd("PRE_WRITE(asa_, struct_sockaddr_sz);") | 
 |       pcmd("PRE_WRITE(alen_, sizeof(__sanitizer_socklen_t));") | 
 |     } else { | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  POST_WRITE(asa_, struct_sockaddr_sz);") | 
 |       pcmd("  POST_WRITE(alen_, sizeof(__sanitizer_socklen_t));") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "getsockname") { | 
 |     if (mode == "pre") { | 
 |       pcmd("PRE_WRITE(asa_, struct_sockaddr_sz);") | 
 |       pcmd("PRE_WRITE(alen_, sizeof(__sanitizer_socklen_t));") | 
 |     } else { | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  POST_WRITE(asa_, struct_sockaddr_sz);") | 
 |       pcmd("  POST_WRITE(alen_, sizeof(__sanitizer_socklen_t));") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "access") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  const char *path = (const char *)path_;") | 
 |       pcmd("  if (path) {") | 
 |       pcmd("    POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "chflags") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  const char *path = (const char *)path_;") | 
 |       pcmd("  if (path) {") | 
 |       pcmd("    POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "fchflags") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "sync") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "kill") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "compat_43_stat43") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "getppid") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "compat_43_lstat43") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "dup") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "pipe") { | 
 |     pcmd("/* pipe returns two descriptors through two returned values */") | 
 |   } else if (syscall == "getegid") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "profil") { | 
 |     if (mode == "pre") { | 
 |       pcmd("if (samples_) {") | 
 |       pcmd("  PRE_WRITE(samples_, size_);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  if (samples_) {") | 
 |       pcmd("    POST_WRITE(samples_, size_);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "ktrace") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *fname = (const char *)fname_;") | 
 |       pcmd("if (fname) {") | 
 |       pcmd("  PRE_READ(fname, __sanitizer::internal_strlen(fname) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *fname = (const char *)fname_;") | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  if (fname) {") | 
 |       pcmd("    POST_READ(fname, __sanitizer::internal_strlen(fname) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "compat_13_sigaction13") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "getgid") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "compat_13_sigprocmask13") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "__getlogin") { | 
 |     if (mode == "pre") { | 
 |       pcmd("if (namebuf_) {") | 
 |       pcmd("  PRE_WRITE(namebuf_, namelen_);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  if (namebuf_) {") | 
 |       pcmd("    POST_WRITE(namebuf_, namelen_);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "__setlogin") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *namebuf = (const char *)namebuf_;") | 
 |       pcmd("if (namebuf) {") | 
 |       pcmd("  PRE_READ(namebuf, __sanitizer::internal_strlen(namebuf) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  const char *namebuf = (const char *)namebuf_;") | 
 |       pcmd("  if (namebuf) {") | 
 |       pcmd("    POST_READ(namebuf, __sanitizer::internal_strlen(namebuf) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "acct") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  const char *path = (const char *)path_;") | 
 |       pcmd("  if (path) {") | 
 |       pcmd("    POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "compat_13_sigpending13") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_13_sigaltstack13") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "ioctl") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "compat_12_oreboot") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "revoke") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  const char *path = (const char *)path_;") | 
 |       pcmd("  if (path) {") | 
 |       pcmd("    POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "symlink") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("const char *link = (const char *)link_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |       pcmd("if (link) {") | 
 |       pcmd("  PRE_READ(link, __sanitizer::internal_strlen(link) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  const char *path = (const char *)path_;") | 
 |       pcmd("  const char *link = (const char *)link_;") | 
 |       pcmd("  if (path) {") | 
 |       pcmd("    POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("  if (link) {") | 
 |       pcmd("    POST_READ(link, __sanitizer::internal_strlen(link) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "readlink") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |       pcmd("if (buf_) {") | 
 |       pcmd("  PRE_WRITE(buf_, count_);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("if (res > 0) {") | 
 |       pcmd("  const char *path = (const char *)path_;") | 
 |       pcmd("  if (path) {") | 
 |       pcmd("    POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("  if (buf_) {") | 
 |       pcmd("    PRE_WRITE(buf_, res);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "execve") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("char **argp = (char **)argp_;") | 
 |       pcmd("char **envp = (char **)envp_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |       pcmd("if (argp && argp[0]) {") | 
 |       pcmd("  char *a = argp[0];") | 
 |       pcmd("  while (a++) {") | 
 |       pcmd("    PRE_READ(a, __sanitizer::internal_strlen(a) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |       pcmd("if (envp && envp[0]) {") | 
 |       pcmd("  char *e = envp[0];") | 
 |       pcmd("  while (e++) {") | 
 |       pcmd("    PRE_READ(e, __sanitizer::internal_strlen(e) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("/* If we are here, something went wrong */") | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("char **argp = (char **)argp_;") | 
 |       pcmd("char **envp = (char **)envp_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |       pcmd("if (argp && argp[0]) {") | 
 |       pcmd("  char *a = argp[0];") | 
 |       pcmd("  while (a++) {") | 
 |       pcmd("    POST_READ(a, __sanitizer::internal_strlen(a) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |       pcmd("if (envp && envp[0]) {") | 
 |       pcmd("  char *e = envp[0];") | 
 |       pcmd("  while (e++) {") | 
 |       pcmd("    POST_READ(e, __sanitizer::internal_strlen(e) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "umask") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "chroot") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  const char *path = (const char *)path_;") | 
 |       pcmd("  if (path) {") | 
 |       pcmd("    POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "compat_43_fstat43") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_43_ogetkerninfo") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_43_ogetpagesize") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_12_msync") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "vfork") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "compat_43_ommap") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "vadvise") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "munmap") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "mprotect") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "madvise") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "mincore") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "getgroups") { | 
 |     if (mode == "pre") { | 
 |       pcmd("unsigned int *gidset = (unsigned int *)gidset_;") | 
 |       pcmd("if (gidset) {") | 
 |       pcmd("  PRE_WRITE(gidset, sizeof(*gidset) * gidsetsize_);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  unsigned int *gidset = (unsigned int *)gidset_;") | 
 |       pcmd("  if (gidset) {") | 
 |       pcmd("    POST_WRITE(gidset, sizeof(*gidset) * gidsetsize_);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "setgroups") { | 
 |     if (mode == "pre") { | 
 |       pcmd("unsigned int *gidset = (unsigned int *)gidset_;") | 
 |       pcmd("if (gidset) {") | 
 |       pcmd("  PRE_READ(gidset, sizeof(*gidset) * gidsetsize_);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  unsigned int *gidset = (unsigned int *)gidset_;") | 
 |       pcmd("  if (gidset) {") | 
 |       pcmd("    POST_READ(gidset, sizeof(*gidset) * gidsetsize_);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "getpgrp") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "setpgid") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "compat_50_setitimer") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_43_owait") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_12_oswapon") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_50_getitimer") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_43_ogethostname") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_43_osethostname") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_43_ogetdtablesize") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "dup2") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "getrandom") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "fcntl") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "compat_50_select") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "fsync") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "setpriority") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "compat_30_socket") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "connect") { | 
 |     if (mode == "pre") { | 
 |       pcmd("PRE_READ(name_, namelen_);") | 
 |     } else { | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  POST_READ(name_, namelen_);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "compat_43_oaccept") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "getpriority") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "compat_43_osend") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_43_orecv") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_13_sigreturn13") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "bind") { | 
 |     if (mode == "pre") { | 
 |       pcmd("PRE_READ(name_, namelen_);") | 
 |     } else { | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  PRE_READ(name_, namelen_);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "setsockopt") { | 
 |     if (mode == "pre") { | 
 |       pcmd("if (val_) {") | 
 |       pcmd("  PRE_READ(val_, valsize_);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  if (val_) {") | 
 |       pcmd("    POST_READ(val_, valsize_);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "listen") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "compat_43_osigvec") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_43_osigblock") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_43_osigsetmask") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_13_sigsuspend13") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_43_osigstack") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_43_orecvmsg") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_43_osendmsg") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_50_gettimeofday") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_50_getrusage") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "getsockopt") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "readv") { | 
 |     if (mode == "pre") { | 
 |       pcmd("struct __sanitizer_iovec *iovp = (struct __sanitizer_iovec *)iovp_;") | 
 |       pcmd("int i;") | 
 |       pcmd("if (iovp) {") | 
 |       pcmd("  PRE_READ(iovp, sizeof(struct __sanitizer_iovec) * iovcnt_);") | 
 |       pcmd("  for (i = 0; i < iovcnt_; i++) {") | 
 |       pcmd("    PRE_WRITE(iovp[i].iov_base, iovp[i].iov_len);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("struct __sanitizer_iovec *iovp = (struct __sanitizer_iovec *)iovp_;") | 
 |       pcmd("int i;") | 
 |       pcmd("uptr m, n = res;") | 
 |       pcmd("if (res > 0) {") | 
 |       pcmd("  if (iovp) {") | 
 |       pcmd("    POST_READ(iovp, sizeof(struct __sanitizer_iovec) * iovcnt_);") | 
 |       pcmd("    for (i = 0; i < iovcnt_ && n > 0; i++) {") | 
 |       pcmd("      m = n > iovp[i].iov_len ? iovp[i].iov_len : n;") | 
 |       pcmd("      POST_WRITE(iovp[i].iov_base, m);") | 
 |       pcmd("      n -= m;") | 
 |       pcmd("    }") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "writev") { | 
 |     if (mode == "pre") { | 
 |       pcmd("struct __sanitizer_iovec *iovp = (struct __sanitizer_iovec *)iovp_;") | 
 |       pcmd("int i;") | 
 |       pcmd("if (iovp) {") | 
 |       pcmd("  PRE_READ(iovp, sizeof(struct __sanitizer_iovec) * iovcnt_);") | 
 |       pcmd("  for (i = 0; i < iovcnt_; i++) {") | 
 |       pcmd("    PRE_READ(iovp[i].iov_base, iovp[i].iov_len);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("struct __sanitizer_iovec *iovp = (struct __sanitizer_iovec *)iovp_;") | 
 |       pcmd("int i;") | 
 |       pcmd("uptr m, n = res;") | 
 |       pcmd("if (res > 0) {") | 
 |       pcmd("  if (iovp) {") | 
 |       pcmd("    POST_READ(iovp, sizeof(struct __sanitizer_iovec) * iovcnt_);") | 
 |       pcmd("    for (i = 0; i < iovcnt_ && n > 0; i++) {") | 
 |       pcmd("      m = n > iovp[i].iov_len ? iovp[i].iov_len : n;") | 
 |       pcmd("      POST_READ(iovp[i].iov_base, m);") | 
 |       pcmd("      n -= m;") | 
 |       pcmd("    }") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "compat_50_settimeofday") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "fchown") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "fchmod") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "compat_43_orecvfrom") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "setreuid") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "setregid") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "rename") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *from = (const char *)from_;") | 
 |       pcmd("const char *to = (const char *)to_;") | 
 |       pcmd("if (from) {") | 
 |       pcmd("  PRE_READ(from, __sanitizer::internal_strlen(from) + 1);") | 
 |       pcmd("}") | 
 |       pcmd("if (to) {") | 
 |       pcmd("  PRE_READ(to, __sanitizer::internal_strlen(to) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  const char *from = (const char *)from_;") | 
 |       pcmd("  const char *to = (const char *)to_;") | 
 |       pcmd("  if (from) {") | 
 |       pcmd("    POST_READ(from, __sanitizer::internal_strlen(from) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("  if (to) {") | 
 |       pcmd("    POST_READ(to, __sanitizer::internal_strlen(to) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "compat_43_otruncate") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_43_oftruncate") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "flock") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "mkfifo") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  const char *path = (const char *)path_;") | 
 |       pcmd("  if (path) {") | 
 |       pcmd("    POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "sendto") { | 
 |     if (mode == "pre") { | 
 |       pcmd("PRE_READ(buf_, len_);") | 
 |       pcmd("PRE_READ(to_, tolen_);") | 
 |     } else { | 
 |       pcmd("if (res >= 0) {") | 
 |       pcmd("  POST_READ(buf_, len_);") | 
 |       pcmd("  POST_READ(to_, tolen_);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "shutdown") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "socketpair") { | 
 |     if (mode == "pre") { | 
 |       pcmd("PRE_WRITE(rsv_, 2 * sizeof(int));") | 
 |     } else { | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  POST_WRITE(rsv_, 2 * sizeof(int));") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "mkdir") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  const char *path = (const char *)path_;") | 
 |       pcmd("  if (path) {") | 
 |       pcmd("    POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "rmdir") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  const char *path = (const char *)path_;") | 
 |       pcmd("  if (path) {") | 
 |       pcmd("    POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "compat_50_utimes") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_50_adjtime") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_43_ogetpeername") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_43_ogethostid") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_43_osethostid") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_43_ogetrlimit") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_43_osetrlimit") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_43_okillpg") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "setsid") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "compat_50_quotactl") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_43_oquota") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_43_ogetsockname") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "nfssvc") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "compat_43_ogetdirentries") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_20_statfs") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_20_fstatfs") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_30_getfh") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_09_ogetdomainname") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_09_osetdomainname") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_09_ouname") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "sysarch") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "__futex") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "__futex_set_robust_list") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "__futex_get_robust_list") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_10_osemsys") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_10_omsgsys") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_10_oshmsys") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "pread") { | 
 |     if (mode == "pre") { | 
 |       pcmd("if (buf_) {") | 
 |       pcmd("  PRE_WRITE(buf_, nbyte_);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("if (res > 0) {") | 
 |       pcmd("  POST_WRITE(buf_, res);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "pwrite") { | 
 |     if (mode == "pre") { | 
 |       pcmd("if (buf_) {") | 
 |       pcmd("  PRE_READ(buf_, nbyte_);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("if (res > 0) {") | 
 |       pcmd("  POST_READ(buf_, res);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "compat_30_ntp_gettime") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "ntp_adjtime") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "setgid") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "setegid") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "seteuid") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "lfs_bmapv") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "lfs_markv") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "lfs_segclean") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_50_lfs_segwait") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_12_stat12") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_12_fstat12") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_12_lstat12") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "pathconf") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("if (res != -1) {") | 
 |       pcmd("  const char *path = (const char *)path_;") | 
 |       pcmd("  if (path) {") | 
 |       pcmd("    POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "getsockopt2") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "fpathconf") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "getrlimit") { | 
 |     if (mode == "pre") { | 
 |       pcmd("PRE_WRITE(rlp_, struct_rlimit_sz);") | 
 |     } else { | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  POST_WRITE(rlp_, struct_rlimit_sz);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "setrlimit") { | 
 |     if (mode == "pre") { | 
 |       pcmd("PRE_READ(rlp_, struct_rlimit_sz);") | 
 |     } else { | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  POST_READ(rlp_, struct_rlimit_sz);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "compat_12_getdirentries") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "mmap") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "__syscall") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "lseek") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "truncate") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  const char *path = (const char *)path_;") | 
 |       pcmd("  if (path) {") | 
 |       pcmd("    POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "ftruncate") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "__sysctl") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const int *name = (const int *)name_;") | 
 |       pcmd("if (name) {") | 
 |       pcmd("  PRE_READ(name, namelen_ * sizeof(*name));") | 
 |       pcmd("}") | 
 |       pcmd("if (newv_) {") | 
 |       pcmd("  PRE_READ(name, newlen_);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  const int *name = (const int *)name_;") | 
 |       pcmd("  if (name) {") | 
 |       pcmd("    POST_READ(name, namelen_ * sizeof(*name));") | 
 |       pcmd("  }") | 
 |       pcmd("  if (newv_) {") | 
 |       pcmd("    POST_READ(name, newlen_);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "mlock") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "munlock") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "undelete") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  const char *path = (const char *)path_;") | 
 |       pcmd("  if (path) {") | 
 |       pcmd("    POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "compat_50_futimes") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "getpgid") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "reboot") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *bootstr = (const char *)bootstr_;") | 
 |       pcmd("if (bootstr) {") | 
 |       pcmd("  PRE_READ(bootstr, __sanitizer::internal_strlen(bootstr) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("/* This call should never return */") | 
 |       pcmd("const char *bootstr = (const char *)bootstr_;") | 
 |       pcmd("if (bootstr) {") | 
 |       pcmd("  POST_READ(bootstr, __sanitizer::internal_strlen(bootstr) + 1);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "poll") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "afssys") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_14___semctl") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "semget") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "semop") { | 
 |     if (mode == "pre") { | 
 |       pcmd("if (sops_) {") | 
 |       pcmd("  PRE_READ(sops_, nsops_ * struct_sembuf_sz);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  if (sops_) {") | 
 |       pcmd("    POST_READ(sops_, nsops_ * struct_sembuf_sz);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "semconfig") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "compat_14_msgctl") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "msgget") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "msgsnd") { | 
 |     if (mode == "pre") { | 
 |       pcmd("if (msgp_) {") | 
 |       pcmd("  PRE_READ(msgp_, msgsz_);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  if (msgp_) {") | 
 |       pcmd("    POST_READ(msgp_, msgsz_);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "msgrcv") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "shmat") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "compat_14_shmctl") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "shmdt") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "shmget") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "compat_50_clock_gettime") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_50_clock_settime") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_50_clock_getres") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "timer_create") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "timer_delete") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "compat_50_timer_settime") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_50_timer_gettime") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "timer_getoverrun") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "compat_50_nanosleep") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "fdatasync") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "mlockall") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "munlockall") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "compat_50___sigtimedwait") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "sigqueueinfo") { | 
 |     if (mode == "pre") { | 
 |       pcmd("if (info_) {") | 
 |       pcmd("  PRE_READ(info_, siginfo_t_sz);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "modctl") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "_ksem_init") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "_ksem_open") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *name = (const char *)name_;") | 
 |       pcmd("if (name) {") | 
 |       pcmd("  PRE_READ(name, __sanitizer::internal_strlen(name) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *name = (const char *)name_;") | 
 |       pcmd("if (name) {") | 
 |       pcmd("  POST_READ(name, __sanitizer::internal_strlen(name) + 1);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "_ksem_unlink") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *name = (const char *)name_;") | 
 |       pcmd("if (name) {") | 
 |       pcmd("  PRE_READ(name, __sanitizer::internal_strlen(name) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *name = (const char *)name_;") | 
 |       pcmd("if (name) {") | 
 |       pcmd("  POST_READ(name, __sanitizer::internal_strlen(name) + 1);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "_ksem_close") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "_ksem_post") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "_ksem_wait") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "_ksem_trywait") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "_ksem_getvalue") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "_ksem_destroy") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "_ksem_timedwait") { | 
 |     if (mode == "pre") { | 
 |       pcmd("if (abstime_) {") | 
 |       pcmd("  PRE_READ(abstime_, struct_timespec_sz);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "mq_open") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *name = (const char *)name_;") | 
 |       pcmd("if (name) {") | 
 |       pcmd("  PRE_READ(name, __sanitizer::internal_strlen(name) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *name = (const char *)name_;") | 
 |       pcmd("if (name) {") | 
 |       pcmd("  POST_READ(name, __sanitizer::internal_strlen(name) + 1);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "mq_close") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "mq_unlink") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *name = (const char *)name_;") | 
 |       pcmd("if (name) {") | 
 |       pcmd("  PRE_READ(name, __sanitizer::internal_strlen(name) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *name = (const char *)name_;") | 
 |       pcmd("if (name) {") | 
 |       pcmd("  POST_READ(name, __sanitizer::internal_strlen(name) + 1);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "mq_getattr") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "mq_setattr") { | 
 |     if (mode == "pre") { | 
 |       pcmd("if (mqstat_) {") | 
 |       pcmd("  PRE_READ(mqstat_, struct_mq_attr_sz);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "mq_notify") { | 
 |     if (mode == "pre") { | 
 |       pcmd("if (notification_) {") | 
 |       pcmd("  PRE_READ(notification_, struct_sigevent_sz);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "mq_send") { | 
 |     if (mode == "pre") { | 
 |       pcmd("if (msg_ptr_) {") | 
 |       pcmd("  PRE_READ(msg_ptr_, msg_len_);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "mq_receive") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "compat_50_mq_timedsend") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_50_mq_timedreceive") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "__posix_rename") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *from = (const char *)from_;") | 
 |       pcmd("const char *to = (const char *)to_;") | 
 |       pcmd("if (from_) {") | 
 |       pcmd("  PRE_READ(from, __sanitizer::internal_strlen(from) + 1);") | 
 |       pcmd("}") | 
 |       pcmd("if (to) {") | 
 |       pcmd("  PRE_READ(to, __sanitizer::internal_strlen(to) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *from = (const char *)from_;") | 
 |       pcmd("const char *to = (const char *)to_;") | 
 |       pcmd("if (from) {") | 
 |       pcmd("  POST_READ(from, __sanitizer::internal_strlen(from) + 1);") | 
 |       pcmd("}") | 
 |       pcmd("if (to) {") | 
 |       pcmd("  POST_READ(to, __sanitizer::internal_strlen(to) + 1);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "swapctl") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_30_getdents") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "minherit") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "lchmod") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "lchown") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "compat_50_lutimes") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "__msync13") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "compat_30___stat13") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_30___fstat13") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_30___lstat13") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "__sigaltstack14") { | 
 |     if (mode == "pre") { | 
 |       pcmd("if (nss_) {") | 
 |       pcmd("  PRE_READ(nss_, struct_sigaltstack_sz);") | 
 |       pcmd("}") | 
 |       pcmd("if (oss_) {") | 
 |       pcmd("  PRE_READ(oss_, struct_sigaltstack_sz);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "__vfork14") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "__posix_chown") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "__posix_fchown") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "__posix_lchown") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "getsid") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "__clone") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "fktrace") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "preadv") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "pwritev") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "compat_16___sigaction14") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "__sigpending14") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "__sigprocmask14") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "__sigsuspend14") { | 
 |     pcmd("if (set_) {") | 
 |     pcmd("  PRE_READ(set_, sizeof(__sanitizer_sigset_t));") | 
 |     pcmd("}") | 
 |   } else if (syscall == "compat_16___sigreturn14") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "__getcwd") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "fchroot") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "compat_30_fhopen") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_30_fhstat") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_20_fhstatfs") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_50_____semctl13") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_50___msgctl13") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_50___shmctl13") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "lchflags") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "issetugid") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "utrace") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *label = (const char *)label_;") | 
 |       pcmd("if (label) {") | 
 |       pcmd("  PRE_READ(label, __sanitizer::internal_strlen(label) + 1);") | 
 |       pcmd("}") | 
 |       pcmd("if (addr_) {") | 
 |       pcmd("  PRE_READ(addr_, len_);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *label = (const char *)label_;") | 
 |       pcmd("if (label) {") | 
 |       pcmd("  POST_READ(label, __sanitizer::internal_strlen(label) + 1);") | 
 |       pcmd("}") | 
 |       pcmd("if (addr_) {") | 
 |       pcmd("  POST_READ(addr_, len_);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "getcontext") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "setcontext") { | 
 |     if (mode == "pre") { | 
 |       pcmd("if (ucp_) {") | 
 |       pcmd("  PRE_READ(ucp_, ucontext_t_sz);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "_lwp_create") { | 
 |     if (mode == "pre") { | 
 |       pcmd("if (ucp_) {") | 
 |       pcmd("  PRE_READ(ucp_, ucontext_t_sz);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "_lwp_exit") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "_lwp_self") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "_lwp_wait") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "_lwp_suspend") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "_lwp_continue") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "_lwp_wakeup") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "_lwp_getprivate") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "_lwp_setprivate") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "_lwp_kill") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "_lwp_detach") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "compat_50__lwp_park") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "_lwp_unpark") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "_lwp_unpark_all") { | 
 |     if (mode == "pre") { | 
 |       pcmd("if (targets_) {") | 
 |       pcmd("  PRE_READ(targets_, ntargets_ * sizeof(__sanitizer_lwpid_t));") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "_lwp_setname") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *name = (const char *)name_;") | 
 |       pcmd("if (name) {") | 
 |       pcmd("  PRE_READ(name, __sanitizer::internal_strlen(name) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *name = (const char *)name_;") | 
 |       pcmd("if (name) {") | 
 |       pcmd("  POST_READ(name, __sanitizer::internal_strlen(name) + 1);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "_lwp_getname") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "_lwp_ctl") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "compat_60_sa_register") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_60_sa_stacks") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_60_sa_enable") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_60_sa_setconcurrency") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_60_sa_yield") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_60_sa_preempt") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "__sigaction_sigtramp") { | 
 |     pcmd("if (nsa_) {") | 
 |     pcmd("  PRE_READ(nsa_, sizeof(__sanitizer_sigaction));") | 
 |     pcmd("}") | 
 |   } else if (syscall == "rasctl") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "kqueue") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "compat_50_kevent") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "_sched_setparam") { | 
 |     pcmd("if (params_) {") | 
 |     pcmd("  PRE_READ(params_, struct_sched_param_sz);") | 
 |     pcmd("}") | 
 |   } else if (syscall == "_sched_getparam") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "_sched_setaffinity") { | 
 |     pcmd("if (cpuset_) {") | 
 |     pcmd("  PRE_READ(cpuset_, size_);") | 
 |     pcmd("}") | 
 |   } else if (syscall == "_sched_getaffinity") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "sched_yield") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "_sched_protect") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "fsync_range") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "uuidgen") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "compat_90_getvfsstat") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "compat_90_statvfs1") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "compat_90_fstatvfs1") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "compat_30_fhstatvfs1") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "extattrctl") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "extattr_set_file") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "extattr_get_file") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "extattr_delete_file") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "extattr_set_fd") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "extattr_get_fd") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "extattr_delete_fd") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "extattr_set_link") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "extattr_get_link") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "extattr_delete_link") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "extattr_list_fd") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "extattr_list_file") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "extattr_list_link") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "compat_50_pselect") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_50_pollts") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "setxattr") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "lsetxattr") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "fsetxattr") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "getxattr") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "lgetxattr") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "fgetxattr") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "listxattr") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "llistxattr") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "flistxattr") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "removexattr") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "lremovexattr") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "fremovexattr") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_50___stat30") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_50___fstat30") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_50___lstat30") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "__getdents30") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "posix_fadvise") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "compat_30___fhstat30") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "compat_50___ntp_gettime30") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "__socket30") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "__getfh30") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *fname = (const char *)fname_;") | 
 |       pcmd("if (fname) {") | 
 |       pcmd("  PRE_READ(fname, __sanitizer::internal_strlen(fname) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *fname = (const char *)fname_;") | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  if (fname) {") | 
 |       pcmd("    POST_READ(fname, __sanitizer::internal_strlen(fname) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "__fhopen40") { | 
 |     if (mode == "pre") { | 
 |       pcmd("if (fhp_) {") | 
 |       pcmd("  PRE_READ(fhp_, fh_size_);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "compat_90_fhstatvfs1") { | 
 |     if (mode == "pre") { | 
 |       pcmd("if (fhp_) {") | 
 |       pcmd("  PRE_READ(fhp_, fh_size_);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "compat_50___fhstat40") { | 
 |     if (mode == "pre") { | 
 |       pcmd("if (fhp_) {") | 
 |       pcmd("  PRE_READ(fhp_, fh_size_);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "aio_cancel") { | 
 |     if (mode == "pre") { | 
 |       pcmd("if (aiocbp_) {") | 
 |       pcmd("  PRE_READ(aiocbp_, sizeof(struct __sanitizer_aiocb));") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "aio_error") { | 
 |     if (mode == "pre") { | 
 |       pcmd("if (aiocbp_) {") | 
 |       pcmd("  PRE_READ(aiocbp_, sizeof(struct __sanitizer_aiocb));") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "aio_fsync") { | 
 |     if (mode == "pre") { | 
 |       pcmd("if (aiocbp_) {") | 
 |       pcmd("  PRE_READ(aiocbp_, sizeof(struct __sanitizer_aiocb));") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "aio_read") { | 
 |     if (mode == "pre") { | 
 |       pcmd("if (aiocbp_) {") | 
 |       pcmd("  PRE_READ(aiocbp_, sizeof(struct __sanitizer_aiocb));") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "aio_return") { | 
 |     if (mode == "pre") { | 
 |       pcmd("if (aiocbp_) {") | 
 |       pcmd("  PRE_READ(aiocbp_, sizeof(struct __sanitizer_aiocb));") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "compat_50_aio_suspend") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "aio_write") { | 
 |     if (mode == "pre") { | 
 |       pcmd("if (aiocbp_) {") | 
 |       pcmd("  PRE_READ(aiocbp_, sizeof(struct __sanitizer_aiocb));") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "lio_listio") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "__mount50") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *type = (const char *)type_;") | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (type) {") | 
 |       pcmd("  PRE_READ(type, __sanitizer::internal_strlen(type) + 1);") | 
 |       pcmd("}") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |       pcmd("if (data_) {") | 
 |       pcmd("  PRE_READ(data_, data_len_);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *type = (const char *)type_;") | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (type) {") | 
 |       pcmd("  POST_READ(type, __sanitizer::internal_strlen(type) + 1);") | 
 |       pcmd("}") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |       pcmd("if (data_) {") | 
 |       pcmd("  POST_READ(data_, data_len_);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "mremap") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "pset_create") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "pset_destroy") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "pset_assign") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "_pset_bind") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "__posix_fadvise50") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "__select50") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "__gettimeofday50") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "__settimeofday50") { | 
 |     if (mode == "pre") { | 
 |       pcmd("if (tv_) {") | 
 |       pcmd("  PRE_READ(tv_, timeval_sz);") | 
 |       pcmd("}") | 
 |       pcmd("if (tzp_) {") | 
 |       pcmd("  PRE_READ(tzp_, struct_timezone_sz);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "__utimes50") { | 
 |     if (mode == "pre") { | 
 |       pcmd("struct __sanitizer_timespec **tptr = (struct __sanitizer_timespec **)tptr_;") | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |       pcmd("if (tptr) {") | 
 |       pcmd("  PRE_READ(tptr[0], struct_timespec_sz);") | 
 |       pcmd("  PRE_READ(tptr[1], struct_timespec_sz);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "__adjtime50") { | 
 |     if (mode == "pre") { | 
 |       pcmd("if (delta_) {") | 
 |       pcmd("  PRE_READ(delta_, timeval_sz);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "__lfs_segwait50") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "__futimes50") { | 
 |     if (mode == "pre") { | 
 |       pcmd("struct __sanitizer_timespec **tptr = (struct __sanitizer_timespec **)tptr_;") | 
 |       pcmd("if (tptr) {") | 
 |       pcmd("  PRE_READ(tptr[0], struct_timespec_sz);") | 
 |       pcmd("  PRE_READ(tptr[1], struct_timespec_sz);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "__lutimes50") { | 
 |     if (mode == "pre") { | 
 |       pcmd("struct __sanitizer_timespec **tptr = (struct __sanitizer_timespec **)tptr_;") | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |       pcmd("if (tptr) {") | 
 |       pcmd("  PRE_READ(tptr[0], struct_timespec_sz);") | 
 |       pcmd("  PRE_READ(tptr[1], struct_timespec_sz);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("struct __sanitizer_timespec **tptr = (struct __sanitizer_timespec **)tptr_;") | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |       pcmd("if (tptr) {") | 
 |       pcmd("  POST_READ(tptr[0], struct_timespec_sz);") | 
 |       pcmd("  POST_READ(tptr[1], struct_timespec_sz);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "__setitimer50") { | 
 |     if (mode == "pre") { | 
 |       pcmd("struct __sanitizer_itimerval *itv = (struct __sanitizer_itimerval *)itv_;") | 
 |       pcmd("if (itv) {") | 
 |       pcmd("  PRE_READ(&itv->it_interval.tv_sec, sizeof(__sanitizer_time_t));") | 
 |       pcmd("  PRE_READ(&itv->it_interval.tv_usec, sizeof(__sanitizer_suseconds_t));") | 
 |       pcmd("  PRE_READ(&itv->it_value.tv_sec, sizeof(__sanitizer_time_t));") | 
 |       pcmd("  PRE_READ(&itv->it_value.tv_usec, sizeof(__sanitizer_suseconds_t));") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "__getitimer50") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "__clock_gettime50") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "__clock_settime50") { | 
 |     if (mode == "pre") { | 
 |       pcmd("if (tp_) {") | 
 |       pcmd("  PRE_READ(tp_, struct_timespec_sz);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "__clock_getres50") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "__nanosleep50") { | 
 |     if (mode == "pre") { | 
 |       pcmd("if (rqtp_) {") | 
 |       pcmd("  PRE_READ(rqtp_, struct_timespec_sz);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "____sigtimedwait50") { | 
 |     if (mode == "pre") { | 
 |       pcmd("if (set_) {") | 
 |       pcmd("  PRE_READ(set_, sizeof(__sanitizer_sigset_t));") | 
 |       pcmd("}") | 
 |       pcmd("if (timeout_) {") | 
 |       pcmd("  PRE_READ(timeout_, struct_timespec_sz);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "__mq_timedsend50") { | 
 |     if (mode == "pre") { | 
 |       pcmd("if (msg_ptr_) {") | 
 |       pcmd("  PRE_READ(msg_ptr_, msg_len_);") | 
 |       pcmd("}") | 
 |       pcmd("if (abs_timeout_) {") | 
 |       pcmd("  PRE_READ(abs_timeout_, struct_timespec_sz);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "__mq_timedreceive50") { | 
 |     if (mode == "pre") { | 
 |       pcmd("if (msg_ptr_) {") | 
 |       pcmd("  PRE_READ(msg_ptr_, msg_len_);") | 
 |       pcmd("}") | 
 |       pcmd("if (abs_timeout_) {") | 
 |       pcmd("  PRE_READ(abs_timeout_, struct_timespec_sz);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "compat_60__lwp_park") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "__kevent50") { | 
 |     if (mode == "pre") { | 
 |       pcmd("if (changelist_) {") | 
 |       pcmd("  PRE_READ(changelist_, nchanges_ * struct_kevent_sz);") | 
 |       pcmd("}") | 
 |       pcmd("if (timeout_) {") | 
 |       pcmd("  PRE_READ(timeout_, struct_timespec_sz);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "__pselect50") { | 
 |     if (mode == "pre") { | 
 |       pcmd("if (ts_) {") | 
 |       pcmd("  PRE_READ(ts_, struct_timespec_sz);") | 
 |       pcmd("}") | 
 |       pcmd("if (mask_) {") | 
 |       pcmd("  PRE_READ(mask_, sizeof(struct __sanitizer_sigset_t));") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "__pollts50") { | 
 |     if (mode == "pre") { | 
 |       pcmd("if (ts_) {") | 
 |       pcmd("  PRE_READ(ts_, struct_timespec_sz);") | 
 |       pcmd("}") | 
 |       pcmd("if (mask_) {") | 
 |       pcmd("  PRE_READ(mask_, sizeof(struct __sanitizer_sigset_t));") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "__aio_suspend50") { | 
 |     if (mode == "pre") { | 
 |       pcmd("int i;") | 
 |       pcmd("const struct aiocb * const *list = (const struct aiocb * const *)list_;") | 
 |       pcmd("if (list) {") | 
 |       pcmd("  for (i = 0; i < nent_; i++) {") | 
 |       pcmd("    if (list[i]) {") | 
 |       pcmd("      PRE_READ(list[i], sizeof(struct __sanitizer_aiocb));") | 
 |       pcmd("    }") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |       pcmd("if (timeout_) {") | 
 |       pcmd("  PRE_READ(timeout_, struct_timespec_sz);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "__stat50") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  if (path) {") | 
 |       pcmd("    POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "__fstat50") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "__lstat50") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  if (path) {") | 
 |       pcmd("    POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "____semctl50") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "__shmctl50") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "__msgctl50") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "__getrusage50") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "__timer_settime50") { | 
 |     if (mode == "pre") { | 
 |       pcmd("struct __sanitizer_itimerval *value = (struct __sanitizer_itimerval *)value_;") | 
 |       pcmd("if (value) {") | 
 |       pcmd("  PRE_READ(&value->it_interval.tv_sec, sizeof(__sanitizer_time_t));") | 
 |       pcmd("  PRE_READ(&value->it_interval.tv_usec, sizeof(__sanitizer_suseconds_t));") | 
 |       pcmd("  PRE_READ(&value->it_value.tv_sec, sizeof(__sanitizer_time_t));") | 
 |       pcmd("  PRE_READ(&value->it_value.tv_usec, sizeof(__sanitizer_suseconds_t));") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("struct __sanitizer_itimerval *value = (struct __sanitizer_itimerval *)value_;") | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  if (value) {") | 
 |       pcmd("    POST_READ(&value->it_interval.tv_sec, sizeof(__sanitizer_time_t));") | 
 |       pcmd("    POST_READ(&value->it_interval.tv_usec, sizeof(__sanitizer_suseconds_t));") | 
 |       pcmd("    POST_READ(&value->it_value.tv_sec, sizeof(__sanitizer_time_t));") | 
 |       pcmd("    POST_READ(&value->it_value.tv_usec, sizeof(__sanitizer_suseconds_t));") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "__timer_gettime50") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "__ntp_gettime50") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "__wait450") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "__mknod50") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  if (path) {") | 
 |       pcmd("    POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "__fhstat50") { | 
 |     if (mode == "pre") { | 
 |       pcmd("if (fhp_) {") | 
 |       pcmd("  PRE_READ(fhp_, fh_size_);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  if (fhp_) {") | 
 |       pcmd("    POST_READ(fhp_, fh_size_);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "pipe2") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "dup3") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "kqueue1") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "paccept") { | 
 |     if (mode == "pre") { | 
 |       pcmd("if (mask_) {") | 
 |       pcmd("  PRE_READ(mask_, sizeof(__sanitizer_sigset_t));") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("if (res >= 0) {") | 
 |       pcmd("  if (mask_) {") | 
 |       pcmd("    PRE_READ(mask_, sizeof(__sanitizer_sigset_t));") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "linkat") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *name1 = (const char *)name1_;") | 
 |       pcmd("const char *name2 = (const char *)name2_;") | 
 |       pcmd("if (name1) {") | 
 |       pcmd("  PRE_READ(name1, __sanitizer::internal_strlen(name1) + 1);") | 
 |       pcmd("}") | 
 |       pcmd("if (name2) {") | 
 |       pcmd("  PRE_READ(name2, __sanitizer::internal_strlen(name2) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *name1 = (const char *)name1_;") | 
 |       pcmd("const char *name2 = (const char *)name2_;") | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  if (name1) {") | 
 |       pcmd("    POST_READ(name1, __sanitizer::internal_strlen(name1) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("  if (name2) {") | 
 |       pcmd("    POST_READ(name2, __sanitizer::internal_strlen(name2) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "renameat") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *from = (const char *)from_;") | 
 |       pcmd("const char *to = (const char *)to_;") | 
 |       pcmd("if (from) {") | 
 |       pcmd("  PRE_READ(from, __sanitizer::internal_strlen(from) + 1);") | 
 |       pcmd("}") | 
 |       pcmd("if (to) {") | 
 |       pcmd("  PRE_READ(to, __sanitizer::internal_strlen(to) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *from = (const char *)from_;") | 
 |       pcmd("const char *to = (const char *)to_;") | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  if (from) {") | 
 |       pcmd("    POST_READ(from, __sanitizer::internal_strlen(from) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("  if (to) {") | 
 |       pcmd("    POST_READ(to, __sanitizer::internal_strlen(to) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "mkfifoat") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  if (path) {") | 
 |       pcmd("    POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "mknodat") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  if (path) {") | 
 |       pcmd("    POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "mkdirat") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  if (path) {") | 
 |       pcmd("    POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "faccessat") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  if (path) {") | 
 |       pcmd("    POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "fchmodat") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  if (path) {") | 
 |       pcmd("    POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "fchownat") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  if (path) {") | 
 |       pcmd("    POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "fexecve") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "fstatat") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "utimensat") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |       pcmd("if (tptr_) {") | 
 |       pcmd("  PRE_READ(tptr_, struct_timespec_sz);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (res > 0) {") | 
 |       pcmd("  if (path) {") | 
 |       pcmd("    POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("  if (tptr_) {") | 
 |       pcmd("    POST_READ(tptr_, struct_timespec_sz);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "openat") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (res > 0) {") | 
 |       pcmd("  if (path) {") | 
 |       pcmd("    POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "readlinkat") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (res > 0) {") | 
 |       pcmd("  if (path) {") | 
 |       pcmd("    POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "symlinkat") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path1 = (const char *)path1_;") | 
 |       pcmd("const char *path2 = (const char *)path2_;") | 
 |       pcmd("if (path1) {") | 
 |       pcmd("  PRE_READ(path1, __sanitizer::internal_strlen(path1) + 1);") | 
 |       pcmd("}") | 
 |       pcmd("if (path2) {") | 
 |       pcmd("  PRE_READ(path2, __sanitizer::internal_strlen(path2) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *path1 = (const char *)path1_;") | 
 |       pcmd("const char *path2 = (const char *)path2_;") | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  if (path1) {") | 
 |       pcmd("    POST_READ(path1, __sanitizer::internal_strlen(path1) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("  if (path2) {") | 
 |       pcmd("    POST_READ(path2, __sanitizer::internal_strlen(path2) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "unlinkat") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  if (path) {") | 
 |       pcmd("    POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "futimens") { | 
 |     if (mode == "pre") { | 
 |       pcmd("struct __sanitizer_timespec **tptr = (struct __sanitizer_timespec **)tptr_;") | 
 |       pcmd("if (tptr) {") | 
 |       pcmd("  PRE_READ(tptr[0], struct_timespec_sz);") | 
 |       pcmd("  PRE_READ(tptr[1], struct_timespec_sz);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("struct __sanitizer_timespec **tptr = (struct __sanitizer_timespec **)tptr_;") | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  if (tptr) {") | 
 |       pcmd("    POST_READ(tptr[0], struct_timespec_sz);") | 
 |       pcmd("    POST_READ(tptr[1], struct_timespec_sz);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "__quotactl") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  if (path) {") | 
 |       pcmd("    POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "posix_spawn") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (pid_) {") | 
 |       pcmd("  if (path) {") | 
 |       pcmd("    POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "recvmmsg") { | 
 |     if (mode == "pre") { | 
 |       pcmd("if (timeout_) {") | 
 |       pcmd("  PRE_READ(timeout_, struct_timespec_sz);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("if (res >= 0) {") | 
 |       pcmd("  if (timeout_) {") | 
 |       pcmd("    POST_READ(timeout_, struct_timespec_sz);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "sendmmsg") { | 
 |     if (mode == "pre") { | 
 |       pcmd("struct __sanitizer_mmsghdr *mmsg = (struct __sanitizer_mmsghdr *)mmsg_;") | 
 |       pcmd("if (mmsg) {") | 
 |       pcmd("  PRE_READ(mmsg, sizeof(struct __sanitizer_mmsghdr) * (vlen_ > 1024 ? 1024 : vlen_));") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("struct __sanitizer_mmsghdr *mmsg = (struct __sanitizer_mmsghdr *)mmsg_;") | 
 |       pcmd("if (res >= 0) {") | 
 |       pcmd("  if (mmsg) {") | 
 |       pcmd("    POST_READ(mmsg, sizeof(struct __sanitizer_mmsghdr) * (vlen_ > 1024 ? 1024 : vlen_));") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "clock_nanosleep") { | 
 |     if (mode == "pre") { | 
 |       pcmd("if (rqtp_) {") | 
 |       pcmd("  PRE_READ(rqtp_, struct_timespec_sz);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("if (rqtp_) {") | 
 |       pcmd("  POST_READ(rqtp_, struct_timespec_sz);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "___lwp_park60") { | 
 |     if (mode == "pre") { | 
 |       pcmd("if (ts_) {") | 
 |       pcmd("  PRE_READ(ts_, struct_timespec_sz);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("if (res == 0) {") | 
 |       pcmd("  if (ts_) {") | 
 |       pcmd("    POST_READ(ts_, struct_timespec_sz);") | 
 |       pcmd("  }") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "posix_fallocate") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "fdiscard") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "wait6") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "clock_getcpuclockid2") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "__getvfsstat90") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "__statvfs190") { | 
 |     if (mode == "pre") { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } else { | 
 |       pcmd("const char *path = (const char *)path_;") | 
 |       pcmd("if (path) {") | 
 |       pcmd("  POST_READ(path, __sanitizer::internal_strlen(path) + 1);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "__fstatvfs190") { | 
 |     pcmd("/* Nothing to do */") | 
 |   } else if (syscall == "__fhstatvfs190") { | 
 |     if (mode == "pre") { | 
 |       pcmd("if (fhp_) {") | 
 |       pcmd("  PRE_READ(fhp_, fh_size_);") | 
 |       pcmd("}") | 
 |     } | 
 |   } else if (syscall == "__acl_get_link") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "__acl_set_link") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "__acl_delete_link") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "__acl_aclcheck_link") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "__acl_get_file") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "__acl_set_file") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "__acl_get_fd") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "__acl_set_fd") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "__acl_delete_file") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "__acl_delete_fd") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "__acl_aclcheck_file") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "__acl_aclcheck_fd") { | 
 |     pcmd("/* TODO */") | 
 |   } else if (syscall == "lpathconf") { | 
 |     pcmd("/* TODO */") | 
 |   } else { | 
 |     print "Unrecognized syscall: " syscall | 
 |     abnormal_exit = 1 | 
 |     exit 1 | 
 |   } | 
 | } |