X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Fcompat%2Fbitfield.h;h=e0a3885cb28d36996558529dfc76e88b63785a9e;hb=534d93a8b2ba86f56dfdf6aa7a10911da5f6432c;hp=72c857c4fbce0348266e6304b19b08f5a7e3dc3b;hpb=f0c01bee96c083f86cc98af9e3eb635629be128b;p=babeltrace.git diff --git a/src/compat/bitfield.h b/src/compat/bitfield.h index 72c857c4..e0a3885c 100644 --- a/src/compat/bitfield.h +++ b/src/compat/bitfield.h @@ -1,28 +1,12 @@ -#ifndef _BABELTRACE_BITFIELD_H -#define _BABELTRACE_BITFIELD_H - /* - * Copyright 2010-2019 - Mathieu Desnoyers - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * SPDX-License-Identifier: MIT * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + * Copyright 2010-2019 Mathieu Desnoyers */ +#ifndef _BABELTRACE_BITFIELD_H +#define _BABELTRACE_BITFIELD_H + #include /* C99 5.2.4.2 Numerical limits */ #include /* C99 7.16 bool type */ #include "compat/limits.h" /* C99 5.2.4.2 Numerical limits */ @@ -41,30 +25,7 @@ #error "bitfield.h requires the compiler representation of signed integers to be two's complement." #endif -/* - * _bt_is_signed_type() willingly generates comparison of unsigned - * expression < 0, which is always false. Silence compiler warnings. - * GCC versions lower than 4.6.0 do not accept diagnostic pragma inside - * functions. - */ -#if defined(__GNUC__) && (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) >= 40600 -# define _BT_DIAG_PUSH _Pragma("GCC diagnostic push") -# define _BT_DIAG_POP _Pragma("GCC diagnostic pop") - -# define _BT_DIAG_STRINGIFY_1(x) #x -# define _BT_DIAG_STRINGIFY(x) _BT_DIAG_STRINGIFY_1(x) - -# define _BT_DIAG_IGNORE(option) \ - _Pragma(_BT_DIAG_STRINGIFY(GCC diagnostic ignored option)) -# define _BT_DIAG_IGNORE_TYPE_LIMITS _BT_DIAG_IGNORE("-Wtype-limits") -#else -# define _BT_DIAG_PUSH -# define _BT_DIAG_POP -# define _BT_DIAG_IGNORE -# define _BT_DIAG_IGNORE_TYPE_LIMITS -#endif - -#define _bt_is_signed_type(type) ((type) -1 < (type) 0) +#define _bt_is_signed_type(type) ((type) -1 < (type) 1) /* * Produce a build-time error if the condition `cond` is non-zero. @@ -387,7 +348,6 @@ do { \ unsigned long _ts = sizeof(type) * CHAR_BIT; /* type size */ \ unsigned long _start_unit, _end_unit, _this_unit; \ unsigned long _end, _cshift; /* _cshift is "complement shift" */ \ - bool _is_signed_type; \ \ if (!_length) { \ *_vptr = 0; \ @@ -399,11 +359,7 @@ do { \ _end_unit = (_end + (_ts - 1)) / _ts; \ \ _this_unit = _end_unit - 1; \ - _BT_DIAG_PUSH \ - _BT_DIAG_IGNORE_TYPE_LIMITS \ - _is_signed_type = _bt_is_signed_type(__typeof__(_v)); \ - _BT_DIAG_POP \ - if (_is_signed_type \ + if (_bt_is_signed_type(__typeof__(_v)) \ && (_ptr[_this_unit] & _bt_lshift((type) 1, (_end % _ts ? _end % _ts : _ts) - 1))) \ _v = ~(__typeof__(_v)) 0; \ else \ @@ -459,7 +415,6 @@ do { \ unsigned long _ts = sizeof(type) * CHAR_BIT; /* type size */ \ unsigned long _start_unit, _end_unit, _this_unit; \ unsigned long _end, _cshift; /* _cshift is "complement shift" */ \ - bool _is_signed_type; \ \ if (!_length) { \ *_vptr = 0; \ @@ -471,11 +426,7 @@ do { \ _end_unit = (_end + (_ts - 1)) / _ts; \ \ _this_unit = _start_unit; \ - _BT_DIAG_PUSH \ - _BT_DIAG_IGNORE_TYPE_LIMITS \ - _is_signed_type = _bt_is_signed_type(__typeof__(_v)); \ - _BT_DIAG_POP \ - if (_is_signed_type \ + if (_bt_is_signed_type(__typeof__(_v)) \ && (_ptr[_this_unit] & _bt_lshift((type) 1, _ts - (_start % _ts) - 1))) \ _v = ~(__typeof__(_v)) 0; \ else \