//===-- asan_benchmarks_test.cc ----------------------===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file is a part of AddressSanitizer, an address sanity checker.
//
// Some benchmarks for the instrumented code.
//===----------------------------------------------------------------------===//

#include "asan_test_utils.h"

template<class T>
__attribute__((noinline))
static void ManyAccessFunc(T *x, size_t n_elements, size_t n_iter) {
  for (size_t iter = 0; iter < n_iter; iter++) {
    break_optimization(0);
    // hand unroll the loop to stress the reg alloc.
    for (size_t i = 0; i <= n_elements - 16; i += 16) {
      x[i + 0] = i;
      x[i + 1] = i;
      x[i + 2] = i;
      x[i + 3] = i;
      x[i + 4] = i;
      x[i + 5] = i;
      x[i + 6] = i;
      x[i + 7] = i;
      x[i + 8] = i;
      x[i + 9] = i;
      x[i + 10] = i;
      x[i + 11] = i;
      x[i + 12] = i;
      x[i + 13] = i;
      x[i + 14] = i;
      x[i + 15] = i;
    }
  }
}

TEST(AddressSanitizer, ManyAccessBenchmark) {
  size_t kLen = 1024;
  int *int_array = new int[kLen];
  ManyAccessFunc(int_array, kLen, 1 << 24);
  delete [] int_array;
}

// access 7 char elements in a 7 byte array (i.e. on the border).
__attribute__((noinline))
static void BorderAccessFunc(char *x, size_t n_iter) {
  for (size_t iter = 0; iter < n_iter; iter++) {
    break_optimization(x);
    x[0] = 0;
    x[1] = 0;
    x[2] = 0;
    x[3] = 0;
    x[4] = 0;
    x[5] = 0;
    x[6] = 0;
  }
}

TEST(AddressSanitizer, BorderAccessBenchmark) {
  char *char_7_array = new char[7];
  BorderAccessFunc(char_7_array, 1 << 30);
  delete [] char_7_array;
}

static void FunctionWithLargeStack() {
  int stack[1000];
  Ident(stack);
}

TEST(AddressSanitizer, FakeStackBenchmark) {
  for (int i = 0; i < 10000000; i++)
    Ident(&FunctionWithLargeStack)();
}

int main(int argc, char **argv) {
  testing::InitGoogleTest(&argc, argv);
  return RUN_ALL_TESTS();
}
