aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRicardo M. Correia <rcorreia@wizy.org>2012-05-31 19:12:01 +0200
committerRicardo M. Correia <rcorreia@wizy.org>2012-05-31 20:33:14 +0200
commit78e851f94f67b56e9baa8a62d6266c6bf979ee9e (patch)
tree277a0bfc514fd1cea6fdd97a3fdadb86debdf1eb
parent5849bd472a3a7296f91b887884946218897ca11f (diff)
downloadbitcoin-78e851f94f67b56e9baa8a62d6266c6bf979ee9e.tar.xz
Fix noinline definition so that it works for more compilers.
-rw-r--r--src/test/bignum_tests.cpp5
-rw-r--r--src/util.h17
2 files changed, 19 insertions, 3 deletions
diff --git a/src/test/bignum_tests.cpp b/src/test/bignum_tests.cpp
index ca17766d13..16e4449e94 100644
--- a/src/test/bignum_tests.cpp
+++ b/src/test/bignum_tests.cpp
@@ -2,6 +2,7 @@
#include <climits>
#include "bignum.h"
+#include "util.h"
BOOST_AUTO_TEST_SUITE(bignum_tests)
@@ -29,9 +30,7 @@ BOOST_AUTO_TEST_SUITE(bignum_tests)
// Let's force this code not to be inlined, in order to actually
// test a generic version of the function. This increases the chance
// that -ftrapv will detect overflows.
-void mysetint64(CBigNum& num, int64 n) __attribute__((noinline));
-
-void mysetint64(CBigNum& num, int64 n)
+NOINLINE void mysetint64(CBigNum& num, int64 n)
{
num.setint64(n);
}
diff --git a/src/util.h b/src/util.h
index 8e65fa7864..0d5221c33d 100644
--- a/src/util.h
+++ b/src/util.h
@@ -43,6 +43,23 @@ static const int64 CENT = 1000000;
#define ARRAYLEN(array) (sizeof(array)/sizeof((array)[0]))
#define printf OutputDebugStringF
+// Unfortunately there's no standard way of preventing a function from being
+// inlined, so we define a macro for it.
+//
+// You should use it like this:
+// NOINLINE void function() {...}
+#if defined(__GNUC__)
+// This also works and will be defined for any compiler implementing gcc
+// extensions, such as clang and icc.
+#define NOINLINE __attribute__((noinline))
+#elif defined(_MSC_VER)
+#define NOINLINE __declspec(noinline)
+#else
+// We give out a warning because it impacts the correctness of one bignum test.
+#warning You should define NOINLINE for your compiler.
+#define NOINLINE
+#endif
+
#ifdef snprintf
#undef snprintf
#endif