mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2026-05-05 13:06:10 +02:00
MINOR: compiler: add a new "ASSUME" macro to help the compiler
This macro takes an expression, tests it and calls an unreachable
statement if false. This allows the compiler to know that such a
combination does not happen, and totally eliminate tests that would
be related to this condition. When the statement is not available
in the compiler, we just perform a break from a do {} while loop
so that the expression remains evaluated if needed (e.g. function
call).
This commit is contained in:
parent
41fc18b1d1
commit
efc897484b
@ -212,6 +212,21 @@
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* By using an unreachable statement, we can tell the compiler that certain
|
||||
* conditions are not expected to be met and let it arrange as it wants to
|
||||
* optimize some checks away. The principle is to place a test on the condition
|
||||
* and call unreachable upon a match. It may also help static code analyzers
|
||||
* know that some conditions are not supposed to happen. This can only be used
|
||||
* with compilers that support it, and we do not want to emit any static code
|
||||
* for other ones, so we use a construct that the compiler should easily be
|
||||
* able to optimize away.
|
||||
*/
|
||||
#if __has_builtin(__builtin_unreachable)
|
||||
# define ASSUME(expr) do { if (!(expr)) __builtin_unreachable(); } while (0)
|
||||
#else
|
||||
# define ASSUME(expr) do { if (!(expr)) break; } while (0)
|
||||
#endif
|
||||
|
||||
/* This prevents the compiler from folding multiple identical code paths into a
|
||||
* single one, by adding a dependency on the line number in the path. This may
|
||||
* typically happen on function tails, or purposely placed abort() before an
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user