mirror of
https://github.com/google/benchmark.git
synced 2024-11-28 15:34:33 +00:00
93bfabc8b8
* Fix #342: DoNotOptimize causes compile errors on older GCC versions. DoNotOptimize uses inline assembly contraints to tell the compiler what the type of the input variable. The 'g' operand allows the input to be any register, memory, or immediate integer operand. However this constraint seems to be too weak on older GCC versions, and certain inputs will cause compile errors. This patch changes the constraint to 'X', which is documented as "any operand whatsoever is allowed". This appears to fix the issues with older GCC versions. However Clang doesn't seem to like "X", and will attempt to put the input into a register even when it can't/shouldn't; causing a compile error. However using "g" seems to work like "X" with GCC, so for this reason Clang still uses "g". * Try alternative formulation to placate GCC
53 lines
1.2 KiB
C++
53 lines
1.2 KiB
C++
#include "benchmark/benchmark.h"
|
|
|
|
#include <cstdint>
|
|
|
|
namespace {
|
|
#if defined(__GNUC__)
|
|
std::uint64_t double_up(const std::uint64_t x) __attribute__((const));
|
|
#endif
|
|
std::uint64_t double_up(const std::uint64_t x) { return x * 2; }
|
|
}
|
|
|
|
// Using DoNotOptimize on types like BitRef seem to cause a lot of problems
|
|
// with the inline assembly on both GCC and Clang.
|
|
struct BitRef {
|
|
int index;
|
|
unsigned char &byte;
|
|
|
|
public:
|
|
static BitRef Make() {
|
|
static unsigned char arr[2] = {};
|
|
BitRef b(1, arr[0]);
|
|
return b;
|
|
}
|
|
private:
|
|
BitRef(int i, unsigned char& b) : index(i), byte(b) {}
|
|
};
|
|
|
|
int main(int, char*[]) {
|
|
// this test verifies compilation of DoNotOptimize() for some types
|
|
|
|
char buffer8[8];
|
|
benchmark::DoNotOptimize(buffer8);
|
|
|
|
char buffer20[20];
|
|
benchmark::DoNotOptimize(buffer20);
|
|
|
|
char buffer1024[1024];
|
|
benchmark::DoNotOptimize(buffer1024);
|
|
benchmark::DoNotOptimize(&buffer1024[0]);
|
|
|
|
int x = 123;
|
|
benchmark::DoNotOptimize(x);
|
|
benchmark::DoNotOptimize(&x);
|
|
benchmark::DoNotOptimize(x += 42);
|
|
|
|
benchmark::DoNotOptimize(double_up(x));
|
|
|
|
// These tests are to e
|
|
benchmark::DoNotOptimize(BitRef::Make());
|
|
BitRef lval = BitRef::Make();
|
|
benchmark::DoNotOptimize(lval);
|
|
}
|