1#include "benchmark/benchmark.h"
2
3#include <cstdint>
4
5namespace {
6#if defined(__GNUC__)
7std::uint64_t double_up(const std::uint64_t x) __attribute__((const));
8#endif
9std::uint64_t double_up(const std::uint64_t x) { return x * 2; }
10}
11
12// Using DoNotOptimize on types like BitRef seem to cause a lot of problems
13// with the inline assembly on both GCC and Clang.
14struct BitRef {
15  int index;
16  unsigned char &byte;
17
18public:
19  static BitRef Make() {
20    static unsigned char arr[2] = {};
21    BitRef b(1, arr[0]);
22    return b;
23  }
24private:
25  BitRef(int i, unsigned char& b) : index(i), byte(b) {}
26};
27
28int main(int, char*[]) {
29  // this test verifies compilation of DoNotOptimize() for some types
30
31  char buffer8[8];
32  benchmark::DoNotOptimize(buffer8);
33
34  char buffer20[20];
35  benchmark::DoNotOptimize(buffer20);
36
37  char buffer1024[1024];
38  benchmark::DoNotOptimize(buffer1024);
39  benchmark::DoNotOptimize(&buffer1024[0]);
40
41  int x = 123;
42  benchmark::DoNotOptimize(x);
43  benchmark::DoNotOptimize(&x);
44  benchmark::DoNotOptimize(x += 42);
45
46  benchmark::DoNotOptimize(double_up(x));
47
48  // These tests are to e
49  benchmark::DoNotOptimize(BitRef::Make());
50  BitRef lval = BitRef::Make();
51  benchmark::DoNotOptimize(lval);
52}
53