diff options
author | Eric Anholt <[email protected]> | 2015-07-10 16:25:26 -0700 |
---|---|---|
committer | Eric Anholt <[email protected]> | 2015-07-17 12:25:54 -0700 |
commit | be1f49bda90425b7fd009ac177b307e61da0f994 (patch) | |
tree | afd9b00c1e9c63900294f6f3cbb31d6e521fb734 | |
parent | bde4c8ec1fd69e312fe21e36c8ce07139916811a (diff) |
mesa: Detect and provide macros for function attributes pure and const.
These are really useful hints to the compiler in the absence of link-time
optimization, and I'm going to use them in VC4.
I've made the const attribute be ATTRIBUTE_CONST unlike other function
attributes, because we have other things in the tree #defining CONST for
their own unrelated purposes.
v2: Alphabetize.
Reviewed-by: Kenneth Graunke <[email protected]> (v1)
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | src/util/macros.h | 20 |
2 files changed, 22 insertions, 0 deletions
diff --git a/configure.ac b/configure.ac index bdfd13417e0..bb6d4f618ff 100644 --- a/configure.ac +++ b/configure.ac @@ -205,10 +205,12 @@ AX_GCC_BUILTIN([__builtin_popcount]) AX_GCC_BUILTIN([__builtin_popcountll]) AX_GCC_BUILTIN([__builtin_unreachable]) +AX_GCC_FUNC_ATTRIBUTE([const]) AX_GCC_FUNC_ATTRIBUTE([flatten]) AX_GCC_FUNC_ATTRIBUTE([format]) AX_GCC_FUNC_ATTRIBUTE([malloc]) AX_GCC_FUNC_ATTRIBUTE([packed]) +AX_GCC_FUNC_ATTRIBUTE([pure]) AX_GCC_FUNC_ATTRIBUTE([unused]) AX_GCC_FUNC_ATTRIBUTE([warn_unused_result]) diff --git a/src/util/macros.h b/src/util/macros.h index 66698e72701..5c5c92ec610 100644 --- a/src/util/macros.h +++ b/src/util/macros.h @@ -103,6 +103,17 @@ do { \ #define assume(expr) assert(expr) #endif +/* Attribute const is used for functions that have no effects other than their + * return value, and only rely on the argument values to compute the return + * value. As a result, calls to it can be CSEed. Note that using memory + * pointed to by the arguments is not allowed for const functions. + */ +#ifdef HAVE_FUNC_ATTRIBUTE_CONST +#define ATTRIBUTE_CONST __attribute__((__const__)) +#else +#define ATTRIBUTE_CONST +#endif + #ifdef HAVE_FUNC_ATTRIBUTE_FLATTEN #define FLATTEN __attribute__((__flatten__)) #else @@ -130,6 +141,15 @@ do { \ #define PACKED #endif +/* Attribute pure is used for functions that have no effects other than their + * return value. As a result, calls to it can be dead code eliminated. + */ +#ifdef HAVE_FUNC_ATTRIBUTE_PURE +#define PURE __attribute__((__pure__)) +#else +#define PURE +#endif + #ifdef __cplusplus /** * Macro function that evaluates to true if T is a trivially |