diff options
| author | Kamil Rytarowski <n54@gmx.com> | 2018-11-16 19:54:13 +0000 | 
|---|---|---|
| committer | Kamil Rytarowski <n54@gmx.com> | 2018-11-16 19:54:13 +0000 | 
| commit | 56ef9065326dc06f35d2a793aec65a067c45193b (patch) | |
| tree | bf77114428b592f88d2cdd401f0abd172c7d5b9a | |
| parent | 9413be94239e3e76262b1a097c35c54a86dd7f00 (diff) | |
| download | bcm5719-llvm-56ef9065326dc06f35d2a793aec65a067c45193b.tar.gz bcm5719-llvm-56ef9065326dc06f35d2a793aec65a067c45193b.zip  | |
Add new interceptor for mi_vector_hash(3)
Summary:
mi_vector_hash(3) provides fast 32bit hash functions.
Add a test for this interface.
Enable the API for NetBSD.
Based on original work by Yang Zheng.
Reviewers: joerg, vitalybuka
Reviewed By: vitalybuka
Subscribers: tomsun.0.7, kubamracek, llvm-commits, mgorny, #sanitizers
Tags: #sanitizers
Differential Revision: https://reviews.llvm.org/D54530
llvm-svn: 347088
3 files changed, 37 insertions, 0 deletions
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc index 07cbf00a7fe..5a9d89952e0 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc +++ b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc @@ -7282,6 +7282,22 @@ INTERCEPTOR(int, getmntinfo, void **mntbufp, int flags) {  #define INIT_GETMNTINFO  #endif +#if SANITIZER_INTERCEPT_MI_VECTOR_HASH +INTERCEPTOR(void, mi_vector_hash, const void *key, SIZE_T len, u32 seed, +            u32 hashes[3]) { +  void *ctx; +  COMMON_INTERCEPTOR_ENTER(ctx, mi_vector_hash, key, len, seed, hashes); +  if (key) +    COMMON_INTERCEPTOR_READ_RANGE(ctx, key, len); +  REAL(mi_vector_hash)(key, len, seed, hashes); +  if (hashes) +    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, hashes, sizeof(hashes[0]) * 3); +} +#define INIT_MI_VECTOR_HASH COMMON_INTERCEPT_FUNCTION(mi_vector_hash) +#else +#define INIT_MI_VECTOR_HASH +#endif +  static void InitializeCommonInterceptors() {    static u64 metadata_mem[sizeof(MetadataHashMap) / sizeof(u64) + 1];    interceptor_metadata_map = new((void *)&metadata_mem) MetadataHashMap(); @@ -7536,6 +7552,7 @@ static void InitializeCommonInterceptors() {    INIT_PROTOENT;    INIT_NETENT;    INIT_GETMNTINFO; +  INIT_MI_VECTOR_HASH;    INIT___PRINTF_CHK;  } diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h b/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h index 0f6fac8f942..3991c4f3513 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h +++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h @@ -517,5 +517,6 @@  #define SANITIZER_INTERCEPT_PROTOENT SI_NETBSD  #define SANITIZER_INTERCEPT_NETENT SI_NETBSD  #define SANITIZER_INTERCEPT_GETMNTINFO SI_NETBSD +#define SANITIZER_INTERCEPT_MI_VECTOR_HASH SI_NETBSD  #endif  // #ifndef SANITIZER_PLATFORM_INTERCEPTORS_H diff --git a/compiler-rt/test/sanitizer_common/TestCases/NetBSD/mi_vector_hash.cc b/compiler-rt/test/sanitizer_common/TestCases/NetBSD/mi_vector_hash.cc new file mode 100644 index 00000000000..1f6c1484888 --- /dev/null +++ b/compiler-rt/test/sanitizer_common/TestCases/NetBSD/mi_vector_hash.cc @@ -0,0 +1,19 @@ +// RUN: %clangxx -O0 -g %s -o %t && %run %t 2>&1 | FileCheck %s + +#include <inttypes.h> +#include <stdio.h> +#include <stdlib.h> + +int main(void) { +  unsigned char key[] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99}; +  uint32_t hashes[3]; +  mi_vector_hash(key, __arraycount(key), 0, hashes); +  for (size_t i = 0; i < __arraycount(hashes); i++) +    printf("hashes[%zu]='%" PRIx32 "'\n", i, hashes[i]); + +  // CHECK: hashes[0]='{{.*}}' +  // CHECK: hashes[1]='{{.*}}' +  // CHECK: hashes[2]='{{.*}}' + +  return 0; +}  | 

