<div dir="ltr">Hi Kamil,<div><br></div><div>This seems to have caused the netbsd specific linters to start failing - as this was for netbsd (and causing my error build to fail) I've temporarily reverted this here:</div><div><br></div><div>echristo@athyra ~/r/llvm-project> git push<br>To github.com:llvm/llvm-project.git<br>   e1838a17898..8f9304f559a  master -> master<br></div><div><br></div><div>and the commit has more information. Sorry about the inconvenience!</div><div><br></div><div>-eric</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Dec 26, 2019 at 4:16 PM Kamil Rytarowski via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
Author: Kamil Rytarowski<br>
Date: 2019-12-27T01:15:39+01:00<br>
New Revision: 78f714f824fac8aa3fdd85908c41538bccefb959<br>
<br>
URL: <a href="https://github.com/llvm/llvm-project/commit/78f714f824fac8aa3fdd85908c41538bccefb959" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/78f714f824fac8aa3fdd85908c41538bccefb959</a><br>
DIFF: <a href="https://github.com/llvm/llvm-project/commit/78f714f824fac8aa3fdd85908c41538bccefb959.diff" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/78f714f824fac8aa3fdd85908c41538bccefb959.diff</a><br>
<br>
LOG: [compiler-rt] [netbsd] Add support for versioned statvfs interceptors<br>
<br>
Summary:<br>
Add support for NetBSD 9.0 and newer versions of interceptors<br>
operating on struct statvfs: fstatvfs, fstatvfs1, getmntinfo,<br>
getvfsstat, statvfs, statvfs1.<br>
<br>
The default promoted interceptors are for NetBSD 9.99.26. Older<br>
ones (currently 9.0) are kept in a new NetBSD specific file:<br>
/sanitizer_common_interceptors_netbsd_compat.inc. This file<br>
defines compat interceptors and mangles `INIT_*` macros,<br>
concatenating the current interceptors and the compat ones.<br>
This redefinition is not elegant, but it avoids preprocessor madness.<br>
<br>
Define struct_statvfs90_sz for the compat purposes.<br>
<br>
Reviewers: mgorny, kcc, vitalybuka, joerg<br>
<br>
Reviewed By: mgorny<br>
<br>
Subscribers: dberris, llvm-commits, #sanitizers<br>
<br>
Tags: #sanitizers, #llvm<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D71700" rel="noreferrer" target="_blank">https://reviews.llvm.org/D71700</a><br>
<br>
Added: <br>
    compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_netbsd_compat.inc<br>
<br>
Modified: <br>
    compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc<br>
    compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_netbsd.cpp<br>
    compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_netbsd.h<br>
<br>
Removed: <br>
<br>
<br>
<br>
################################################################################<br>
diff  --git a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc<br>
index 2d9636a9c879..8f365ee30854 100644<br>
--- a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc<br>
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc<br>
@@ -79,13 +79,15 @@<br>
 #define devname __devname50<br>
 #define fgetpos __fgetpos50<br>
 #define fsetpos __fsetpos50<br>
+#define fstatvfs __fstatvfs90<br>
+#define fstatvfs1 __fstatvfs190<br>
 #define fts_children __fts_children60<br>
 #define fts_close __fts_close60<br>
 #define fts_open __fts_open60<br>
 #define fts_read __fts_read60<br>
 #define fts_set __fts_set60<br>
 #define getitimer __getitimer50<br>
-#define getmntinfo __getmntinfo13<br>
+#define getmntinfo __getmntinfo90<br>
 #define getpwent __getpwent50<br>
 #define getpwnam __getpwnam50<br>
 #define getpwnam_r __getpwnam_r50<br>
@@ -95,6 +97,7 @@<br>
 #define getutxent __getutxent50<br>
 #define getutxid __getutxid50<br>
 #define getutxline __getutxline50<br>
+#define getvfsstat __getvfsstat90<br>
 #define pututxline __pututxline50<br>
 #define glob __glob30<br>
 #define gmtime __gmtime50<br>
@@ -116,6 +119,8 @@<br>
 #define sigprocmask __sigprocmask14<br>
 #define sigtimedwait __sigtimedwait50<br>
 #define stat __stat50<br>
+#define statvfs __statvfs90<br>
+#define statvfs1 __statvfs190<br>
 #define time __time50<br>
 #define times __times13<br>
 #define unvis __unvis50<br>
@@ -9708,6 +9713,8 @@ INTERCEPTOR(void, qsort_r, void *base, SIZE_T nmemb, SIZE_T size,<br>
 #define INIT_QSORT_R<br>
 #endif<br>
<br>
+#include "sanitizer_common_interceptors_netbsd_compat.inc"<br>
+<br>
 static void InitializeCommonInterceptors() {<br>
 #if SI_POSIX<br>
   static u64 metadata_mem[sizeof(MetadataHashMap) / sizeof(u64) + 1];<br>
<br>
diff  --git a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_netbsd_compat.inc b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_netbsd_compat.inc<br>
new file mode 100644<br>
index 000000000000..0f05d635145d<br>
--- /dev/null<br>
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_netbsd_compat.inc<br>
@@ -0,0 +1,127 @@<br>
+//===-- sanitizer_common_interceptors_netbsd_compat.inc ---------*- C++ -*-===//<br>
+//<br>
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.<br>
+// See <a href="https://llvm.org/LICENSE.txt" rel="noreferrer" target="_blank">https://llvm.org/LICENSE.txt</a> for license information.<br>
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+//<br>
+// Common function interceptors for tools like AddressSanitizer,<br>
+// ThreadSanitizer, MemorySanitizer, etc.<br>
+//<br>
+// Interceptors for NetBSD old function calls that have been versioned.<br>
+//<br>
+// NetBSD minimal version supported 9.0.<br>
+// NetBSD current version supported 9.99.26.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+#if SANITIZER_NETBSD<br>
+<br>
+// First undef all mangled symbols.<br>
+// Next, define compat interceptors.<br>
+// Finally, undef INIT_ and redefine it. This allows to avoid preprocessor issues.<br>
+<br>
+#undef fstatvfs<br>
+#undef fstatvfs1<br>
+#undef getmntinfo<br>
+#undef getvfsstat<br>
+#undef statvfs<br>
+#undef statvfs1<br>
+<br>
+INTERCEPTOR(int, statvfs, char *path, void *buf) {<br>
+  void *ctx;<br>
+  COMMON_INTERCEPTOR_ENTER(ctx, statvfs, path, buf);<br>
+  if (path) COMMON_INTERCEPTOR_READ_RANGE(ctx, path, REAL(strlen)(path) + 1);<br>
+  // FIXME: under ASan the call below may write to freed memory and corrupt<br>
+  // its metadata. See<br>
+  // <a href="https://github.com/google/sanitizers/issues/321" rel="noreferrer" target="_blank">https://github.com/google/sanitizers/issues/321</a>.<br>
+  int res = REAL(statvfs)(path, buf);<br>
+  if (!res) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, struct_statvfs90_sz);<br>
+  return res;<br>
+}<br>
+<br>
+INTERCEPTOR(int, fstatvfs, int fd, void *buf) {<br>
+  void *ctx;<br>
+  COMMON_INTERCEPTOR_ENTER(ctx, fstatvfs, fd, buf);<br>
+  COMMON_INTERCEPTOR_FD_ACCESS(ctx, fd);<br>
+  // FIXME: under ASan the call below may write to freed memory and corrupt<br>
+  // its metadata. See<br>
+  // <a href="https://github.com/google/sanitizers/issues/321" rel="noreferrer" target="_blank">https://github.com/google/sanitizers/issues/321</a>.<br>
+  int res = REAL(fstatvfs)(fd, buf);<br>
+  if (!res) {<br>
+    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, struct_statvfs90_sz);<br>
+    if (fd >= 0)<br>
+      COMMON_INTERCEPTOR_FD_ACQUIRE(ctx, fd);<br>
+  }<br>
+  return res;<br>
+}<br>
+<br>
+#undef INIT_STATVFS<br>
+#define INIT_STATVFS \<br>
+  COMMON_INTERCEPT_FUNCTION(statvfs); \<br>
+  COMMON_INTERCEPT_FUNCTION(fstatvfs); \<br>
+  COMMON_INTERCEPT_FUNCTION(__statvfs90); \<br>
+  COMMON_INTERCEPT_FUNCTION(__fstatvfs90)<br>
+<br>
+INTERCEPTOR(int, __getmntinfo13, void **mntbufp, int flags) {<br>
+  void *ctx;<br>
+  COMMON_INTERCEPTOR_ENTER(ctx, __getmntinfo13, mntbufp, flags);<br>
+  int cnt = REAL(__getmntinfo13)(mntbufp, flags);<br>
+  if (cnt > 0 && mntbufp) {<br>
+    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, mntbufp, sizeof(void *));<br>
+    if (*mntbufp)<br>
+      COMMON_INTERCEPTOR_WRITE_RANGE(ctx, *mntbufp, cnt * struct_statvfs90_sz);<br>
+  }<br>
+  return cnt;<br>
+}<br>
+<br>
+#undef INIT_GETMNTINFO<br>
+#define INIT_GETMNTINFO \<br>
+  COMMON_INTERCEPT_FUNCTION(__getmntinfo13); \<br>
+  COMMON_INTERCEPT_FUNCTION(__getmntinfo90)<br>
+<br>
+INTERCEPTOR(int, getvfsstat, void *buf, SIZE_T bufsize, int flags) {<br>
+  void *ctx;<br>
+  COMMON_INTERCEPTOR_ENTER(ctx, getvfsstat, buf, bufsize, flags);<br>
+  int ret = REAL(getvfsstat)(buf, bufsize, flags);<br>
+  if (buf && ret > 0)<br>
+    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, ret * struct_statvfs90_sz);<br>
+  return ret;<br>
+}<br>
+<br>
+#undef INIT_GETVFSSTAT<br>
+#define INIT_GETVFSSTAT \<br>
+  COMMON_INTERCEPT_FUNCTION(getvfsstat); \<br>
+  COMMON_INTERCEPT_FUNCTION(__getvfsstat90)<br>
+<br>
+INTERCEPTOR(int, statvfs1, const char *path, void *buf, int flags) {<br>
+  void *ctx;<br>
+  COMMON_INTERCEPTOR_ENTER(ctx, statvfs1, path, buf, flags);<br>
+  if (path) COMMON_INTERCEPTOR_READ_RANGE(ctx, path, REAL(strlen)(path) + 1);<br>
+  int res = REAL(statvfs1)(path, buf, flags);<br>
+  if (!res) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, struct_statvfs90_sz);<br>
+  return res;<br>
+}<br>
+<br>
+INTERCEPTOR(int, fstatvfs1, int fd, void *buf, int flags) {<br>
+  void *ctx;<br>
+  COMMON_INTERCEPTOR_ENTER(ctx, fstatvfs1, fd, buf, flags);<br>
+  COMMON_INTERCEPTOR_FD_ACCESS(ctx, fd);<br>
+  int res = REAL(fstatvfs1)(fd, buf, flags);<br>
+  if (!res) {<br>
+    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, struct_statvfs90_sz);<br>
+    if (fd >= 0)<br>
+      COMMON_INTERCEPTOR_FD_ACQUIRE(ctx, fd);<br>
+  }<br>
+  return res;<br>
+}<br>
+<br>
+#undef INIT_STATVFS1<br>
+#define INIT_STATVFS1 \<br>
+  COMMON_INTERCEPT_FUNCTION(statvfs1); \<br>
+  COMMON_INTERCEPT_FUNCTION(fstatvfs1); \<br>
+  COMMON_INTERCEPT_FUNCTION(__statvfs190); \<br>
+  COMMON_INTERCEPT_FUNCTION(__fstatvfs190)<br>
+<br>
+#endif<br>
<br>
diff  --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_netbsd.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_netbsd.cpp<br>
index 1dcfbcb8047a..24e577d3010f 100644<br>
--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_netbsd.cpp<br>
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_netbsd.cpp<br>
@@ -2414,4 +2414,42 @@ CHECK_SIZE_AND_OFFSET(modctl_load_t, ml_flags);<br>
 CHECK_SIZE_AND_OFFSET(modctl_load_t, ml_props);<br>
 CHECK_SIZE_AND_OFFSET(modctl_load_t, ml_propslen);<br>
<br>
+// Compat with 9.0<br>
+struct statvfs90 {<br>
+  unsigned long f_flag;<br>
+  unsigned long f_bsize;<br>
+  unsigned long f_frsize;<br>
+  unsigned long f_iosize;<br>
+<br>
+  u64 f_blocks;<br>
+  u64 f_bfree;<br>
+  u64 f_bavail;<br>
+  u64 f_bresvd;<br>
+<br>
+  u64 f_files;<br>
+  u64 f_ffree;<br>
+  u64 f_favail;<br>
+  u64 f_fresvd;<br>
+<br>
+  u64 f_syncreads;<br>
+  u64 f_syncwrites;<br>
+<br>
+  u64 f_asyncreads;<br>
+  u64 f_asyncwrites;<br>
+<br>
+  struct {<br>
+    s32 __fsid_val[2];<br>
+  } f_fsidx;<br>
+  unsigned long f_fsid;<br>
+  unsigned long f_namemax;<br>
+  u32 f_owner;<br>
+<br>
+  u32 f_spare[4];<br>
+<br>
+  char f_fstypename[_VFS_NAMELEN];<br>
+  char f_mntonname[_VFS_MNAMELEN];<br>
+  char f_mntfromname[_VFS_MNAMELEN];<br>
+};<br>
+unsigned struct_statvfs90_sz = sizeof(struct statvfs90);<br>
+<br>
 #endif  // SANITIZER_NETBSD<br>
<br>
diff  --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_netbsd.h b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_netbsd.h<br>
index 612b34b3e0ca..794efdb6eff6 100644<br>
--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_netbsd.h<br>
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_netbsd.h<br>
@@ -2420,6 +2420,9 @@ struct __sanitizer_cdbw {<br>
<br>
 #define SIGACTION_SYMNAME __sigaction14<br>
<br>
+// Compat with 9.0<br>
+extern unsigned struct_statvfs90_sz;<br>
+<br>
 #endif  // SANITIZER_NETBSD<br>
<br>
 #endif<br>
<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>