On 11/05/17 16:26, Daniel Hellstrom wrote:
From: Jacob Hansen <jacob.han...@gaisler.com>
---
cpukit/score/include/rtems/score/threadqimpl.h | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/cpukit/score/include/rtems/score/threadqimpl.h
b/cpukit/score/include/rtems/score/threadqimpl.h
index 574221c..975221c 100644
--- a/cpukit/score/include/rtems/score/threadqimpl.h
+++ b/cpukit/score/include/rtems/score/threadqimpl.h
@@ -1140,9 +1140,7 @@ typedef struct {
#define THREAD_QUEUE_OBJECT_ASSERT( object_type, wait_queue_member ) \
RTEMS_STATIC_ASSERT( \
offsetof( object_type, wait_queue_member ) \
- == offsetof( Thread_queue_Object, Wait_queue ) \
- && ( &( ( (object_type *) 0 )->wait_queue_member ) \
- == ( &( (Thread_queue_Object *) 0 )->Wait_queue ) ), \
+ == offsetof( Thread_queue_Object, Wait_queue ), \
object_type \
)
This assertion checks two things.
1. That the member offset of both structures is equal.
2. That the type of the members is identical.
You remove (2). A quick test of
struct s {
int i;
};
_Static_assert(__builtin_types_compatible_p(__typeof(((struct s
*)0)->i), int), "s");
struct t {
int i;
};
_Static_assert(&(((struct s *)4096)->i) == &(((struct t *)4096)->i), "t");
struct u {
int i;
};
_Static_assert(&(((struct s *)0)->i) == &(((struct u *)0)->i), "u");
with clang results in
clang -S test.c -o -
test.c:11:16: error: static_assert expression is not an integral
constant expression
_Static_assert(&(((struct s *)4096)->i) == &(((struct t *)4096)->i), "t");
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
test.c:11:19: note: cast that performs the conversions of a
reinterpret_cast is not allowed in a constant expression
_Static_assert(&(((struct s *)4096)->i) == &(((struct t *)4096)->i), "t");
^
test.c:17:16: error: static_assert expression is not an integral
constant expression
_Static_assert(&(((struct s *)0)->i) == &(((struct u *)0)->i), "u");
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
test.c:17:35: note: cannot access field of null pointer
_Static_assert(&(((struct s *)0)->i) == &(((struct u *)0)->i), "u");
^
2 errors generated.
with gcc results in
gcc -S -o - test.c -std=c11
.file "test.c"
.ident "GCC: (SUSE Linux) 4.8.1 20130909 [gcc-4_8-branch
revision 202388]"
.section .note.GNU-stack,"",@progbits
So, maybe use |__builtin_types_compatible_p() and typeof (should be done
via <rtems/score/basedefs.h>). Maybe ask on the LLVM mailing list on how
to check structure member types.
|
--
Sebastian Huber, embedded brains GmbH
Address : Dornierstr. 4, D-82178 Puchheim, Germany
Phone : +49 89 189 47 41-16
Fax : +49 89 189 47 41-09
E-Mail : sebastian.hu...@embedded-brains.de
PGP : Public key available on request.
Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.
_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel