[sgen] Use types with explicit size for protocol entries, on the reader end
authorVlad Brezae <brezaevlad@gmail.com>
Thu, 5 May 2016 20:29:32 +0000 (23:29 +0300)
committerVlad Brezae <brezaevlad@gmail.com>
Mon, 9 May 2016 23:31:40 +0000 (02:31 +0300)
mono/sgen/sgen-protocol-def.h
mono/sgen/sgen-protocol.h
tools/sgen/sgen-grep-binprot.c

index 3ab36e3bf660f380b9b21cf554f0e659899eb520..e68f5bf76271e2337868c93513e068ce7a932574 100644 (file)
@@ -284,7 +284,7 @@ END_PROTOCOL_ENTRY
 BEGIN_PROTOCOL_ENTRY6 (binary_protocol_missing_remset, TYPE_POINTER, obj, TYPE_POINTER, obj_vtable, TYPE_INT, offset, TYPE_POINTER, value, TYPE_POINTER, value_vtable, TYPE_BOOL, value_pinned)
 DEFAULT_PRINT ()
 IS_ALWAYS_MATCH (FALSE)
-MATCH_INDEX (ptr == entry->obj ? 0 : ptr == entry->value ? 3 : ptr == (char*)entry->obj + entry->offset ? BINARY_PROTOCOL_MATCH : BINARY_PROTOCOL_NO_MATCH)
+MATCH_INDEX (ptr == entry->obj ? 0 : ptr == entry->value ? 3 : ptr == entry->obj + entry->offset ? BINARY_PROTOCOL_MATCH : BINARY_PROTOCOL_NO_MATCH)
 IS_VTABLE_MATCH (ptr == entry->obj_vtable || ptr == entry->value_vtable)
 END_PROTOCOL_ENTRY
 
@@ -331,7 +331,7 @@ IS_VTABLE_MATCH (FALSE)
 END_PROTOCOL_ENTRY_HEAVY
 
 BEGIN_PROTOCOL_ENTRY_HEAVY3 (binary_protocol_dislink_update, TYPE_POINTER, link, TYPE_POINTER, obj, TYPE_BOOL, track)
-CUSTOM_PRINT(entry->obj ? printf ("link %p obj %p track %d", entry->link, entry->obj, entry->track) : printf ("link %p obj %p", entry->link, entry->obj))
+CUSTOM_PRINT(entry->obj ? printf ("link 0x%"MWORD_FORMAT_SPEC_P" obj 0x%"MWORD_FORMAT_SPEC_P" track %d", entry->link, entry->obj, entry->track) : printf ("link 0x%"MWORD_FORMAT_SPEC_P" obj 0x%"MWORD_FORMAT_SPEC_P, entry->link, entry->obj))
 IS_ALWAYS_MATCH (FALSE)
 MATCH_INDEX (ptr == entry->link ? 0 : ptr == entry->obj ? 1 : BINARY_PROTOCOL_NO_MATCH)
 IS_VTABLE_MATCH (FALSE)
index 5ec3680fc5a58018a358eaa583afdf9613753ddf..6ce194c00d8f684ab76d5c80dc3a4d6ccbc8a61a 100644 (file)
 #define PROTOCOL_STRUCT(method) method ## _struct
 #define CLIENT_PROTOCOL_NAME(method) sgen_client_ ## method
 
+#ifndef TYPE_INT
 #define TYPE_INT int
+#endif
+#ifndef TYPE_LONGLONG
 #define TYPE_LONGLONG long long
+#endif
+#ifndef TYPE_SIZE
 #define TYPE_SIZE size_t
+#endif
+#ifndef TYPE_POINTER
 #define TYPE_POINTER gpointer
+#endif
+#ifndef TYPE_BOOL
 #define TYPE_BOOL gboolean
+#endif
 
 enum {
 #define BEGIN_PROTOCOL_ENTRY0(method) PROTOCOL_ID(method),
index 14362ae55dc67088669cd82ff79c3fbb486da764..a152af8370762ae4e3c1ccb1ba04ca4a7781b02a 100644 (file)
@@ -4,7 +4,21 @@
 #include <glib.h>
 #include <unistd.h>
 #include <fcntl.h>
-
+#include <stdint.h>
+#include <inttypes.h>
+#include <config.h>
+
+#if SIZEOF_VOID_P == 4
+typedef int32_t mword;
+#define MWORD_FORMAT_SPEC_D PRId32
+#define MWORD_FORMAT_SPEC_P PRIx32
+#else
+typedef int64_t mword;
+#define MWORD_FORMAT_SPEC_D PRId64
+#define MWORD_FORMAT_SPEC_P PRIx64
+#endif
+#define TYPE_SIZE      mword
+#define TYPE_POINTER   mword
 #include <mono/sgen/sgen-protocol.h>
 
 #define SGEN_PROTOCOL_EOF      255
@@ -221,10 +235,10 @@ print_entry_content (int entries_size, PrintEntry *entries, gboolean color_outpu
                        printf ("%lld", *(long long*) entries [i].data);
                        break;
                case TYPE_SIZE:
-                       printf ("%lu", *(size_t*) entries [i].data);
+                       printf ("%"MWORD_FORMAT_SPEC_D, *(mword*) entries [i].data);
                        break;
                case TYPE_POINTER:
-                       printf ("%p", *(gpointer*) entries [i].data);
+                       printf ("0x%"MWORD_FORMAT_SPEC_P, *(mword*) entries [i].data);
                        break;
                case TYPE_BOOL:
                        printf ("%s", *(gboolean*) entries [i].data ? "true" : "false");
@@ -428,13 +442,13 @@ print_entry (int type, void *data, int num_nums, int *match_indices, gboolean co
 
 #define TYPE_INT int
 #define TYPE_LONGLONG long long
-#define TYPE_SIZE size_t
-#define TYPE_POINTER gpointer
+#define TYPE_SIZE mword
+#define TYPE_POINTER mword
 
 static gboolean
-matches_interval (gpointer ptr, gpointer start, int size)
+matches_interval (mword ptr, mword start, int size)
 {
-       return ptr >= start && (char*)ptr < (char*)start + size;
+       return ptr >= start && ptr < start + size;
 }
 
 /* Returns the index of the field where a match was found,
@@ -442,7 +456,7 @@ matches_interval (gpointer ptr, gpointer start, int size)
  * BINARY_PROTOCOL_MATCH for a match with no index.
  */
 static int
-match_index (gpointer ptr, int type, void *data)
+match_index (mword ptr, int type, void *data)
 {
        switch (TYPE (type)) {
 
@@ -505,7 +519,7 @@ match_index (gpointer ptr, int type, void *data)
 }
 
 static gboolean
-is_vtable_match (gpointer ptr, int type, void *data)
+is_vtable_match (mword ptr, int type, void *data)
 {
        switch (TYPE (type)) {
 
@@ -686,15 +700,15 @@ main (int argc, char *argv[])
                } else {
                        int match_indices [num_nums + 1];
                        gboolean match = is_always_match (type);
-                       match_indices [num_nums] = num_nums == 0 ? match_index (NULL, type, data) : BINARY_PROTOCOL_NO_MATCH;
+                       match_indices [num_nums] = num_nums == 0 ? match_index (0, type, data) : BINARY_PROTOCOL_NO_MATCH;
                        match = match_indices [num_nums] != BINARY_PROTOCOL_NO_MATCH;
                        for (i = 0; i < num_nums; ++i) {
-                               match_indices [i] = match_index ((gpointer) nums [i], type, data);
+                               match_indices [i] = match_index ((mword) nums [i], type, data);
                                match = match || match_indices [i] != BINARY_PROTOCOL_NO_MATCH;
                        }
                        if (!match) {
                                for (i = 0; i < num_vtables; ++i) {
-                                       if (is_vtable_match ((gpointer) vtables [i], type, data)) {
+                                       if (is_vtable_match ((mword) vtables [i], type, data)) {
                                                match = TRUE;
                                                break;
                                        }