Home | History | Annotate | Download | only in test
      1 #include "benchmark/benchmark.h"
      2 
      3 #include <cstdint>
      4 
      5 namespace {
      6 #if defined(__GNUC__)
      7 std::uint64_t double_up(const std::uint64_t x) __attribute__((const));
      8 #endif
      9 std::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.
     14 struct BitRef {
     15   int index;
     16   unsigned char &byte;
     17 
     18 public:
     19   static BitRef Make() {
     20     static unsigned char arr[2] = {};
     21     BitRef b(1, arr[0]);
     22     return b;
     23   }
     24 private:
     25   BitRef(int i, unsigned char& b) : index(i), byte(b) {}
     26 };
     27 
     28 int 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