Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
add a new stressing test to GRAS. Yeah, it actually breaks things quite often...
[simgrid.git] / tools / gras / struct_diff.c
1 /* struct_diff -- little tool to see which structure's field are modified on mc_diff */
2
3 /* Copyright (c) 2012. The SimGrid Team. All rights reserved.               */
4
5 /* This program is free software; you can redistribute it and/or modify it
6  * under the terms of the license (GNU LGPL) which comes with this package. */
7
8 #include <unistd.h>
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <string.h>
12 #include <errno.h>
13 #include <sys/types.h>
14 #include <sys/stat.h>
15 #include <fcntl.h>
16
17 #include "xbt.h"
18 #include "xbt/datadesc.h"
19 #include "xbt/file_stat.h"
20 #include "../../src/xbt/datadesc/datadesc_private.h" // RAAAAH! ugly relative path, but it's late, I want it to be done NOW.
21 #include "simgrid/simix.h"
22 #include "../../src/simix/smx_smurf_private.h" // RAAAAH! ugly relative path, but it's even later and it still doesn't work
23
24 static void define_types(void) {
25   xbt_datadesc_type_t desc;
26
27   /* typedef struct xbt_swag_hookup {
28    *    void *next;
29    *    void *prev;
30    *  } s_xbt_swag_hookup_t; */
31   desc = xbt_datadesc_struct("s_xbt_swag_hookup_t");
32   xbt_datadesc_struct_append(desc,"next",xbt_datadesc_by_name("data pointer"));
33   xbt_datadesc_struct_append(desc,"prev",xbt_datadesc_by_name("data pointer"));
34   xbt_datadesc_struct_close(desc);
35
36   /* FIXME: maybe we should provide the internal details */
37   xbt_datadesc_copy("smx_host_t",xbt_datadesc_by_name("data pointer"));
38   xbt_datadesc_copy("smx_context_t",xbt_datadesc_by_name("data pointer"));
39   xbt_datadesc_copy("smx_action_t",xbt_datadesc_by_name("data pointer"));
40   xbt_datadesc_copy("xbt_dict_t",xbt_datadesc_by_name("data pointer"));
41   xbt_datadesc_copy("xbt_fifo_t",xbt_datadesc_by_name("data pointer"));
42   xbt_datadesc_copy("smx_process_t",xbt_datadesc_by_name("data pointer"));
43
44   /* typedef struct {
45    *   char *msg;
46    *   xbt_errcat_t category;
47
48    *   int value;
49    *   short int remote;
50    *   char *host;
51    *   char *procname;
52    *
53    *   int pid;
54    *   char *file;
55    *   int line;
56    *   char *func;
57
58    *   int used;
59    *   char **bt_strings;
60    *   void *bt[XBT_BACKTRACE_SIZE];
61    * } xbt_ex_t;   */
62   desc = xbt_datadesc_struct("xbt_ex_t");
63   xbt_datadesc_struct_append(desc,"msg",xbt_datadesc_by_name("string"));
64
65   xbt_assert(sizeof(xbt_errcat_t)==sizeof(int),
66       "I was assuming that xbt_errcat_t is of the same size than integer, but it's not true: it's %zu (int:%zu)\n",
67       sizeof(xbt_errcat_t),sizeof(int));
68   xbt_datadesc_struct_append(desc,"category",xbt_datadesc_by_name("short int"));
69
70   xbt_datadesc_struct_append(desc,"value",xbt_datadesc_by_name("short int"));
71   xbt_datadesc_struct_append(desc,"remote",xbt_datadesc_by_name("short int"));
72   xbt_datadesc_struct_append(desc,"host",xbt_datadesc_by_name("string"));
73   xbt_datadesc_struct_append(desc,"procname",xbt_datadesc_by_name("string"));
74   xbt_datadesc_struct_append(desc,"pid",xbt_datadesc_by_name("int"));
75   xbt_datadesc_struct_append(desc,"file",xbt_datadesc_by_name("string"));
76   xbt_datadesc_struct_append(desc,"line",xbt_datadesc_by_name("int"));
77   xbt_datadesc_struct_append(desc,"func",xbt_datadesc_by_name("string"));
78   xbt_datadesc_struct_append(desc,"used",xbt_datadesc_by_name("int"));
79   xbt_datadesc_struct_append(desc,"bt_strings",xbt_datadesc_by_name("data pointer"));
80   xbt_datadesc_struct_append(desc,"bt",xbt_datadesc_array_fixed("xbt_bt",xbt_datadesc_by_name("data pointer"),XBT_BACKTRACE_SIZE));
81   xbt_datadesc_struct_close(desc);
82
83   /* typedef struct {
84    *   __ex_mctx_t *ctx_mctx;
85    *   volatile int ctx_caught;
86    *   volatile xbt_ex_t exception;
87    * } xbt_running_ctx_t;   */
88   desc = xbt_datadesc_struct("xbt_running_ctx_t");
89   xbt_datadesc_struct_append(desc,"ctx_mctx",xbt_datadesc_by_name("data pointer"));
90   xbt_datadesc_struct_append(desc,"ctx_caught",xbt_datadesc_by_name("int"));
91   xbt_datadesc_struct_append(desc,"exception",xbt_datadesc_by_name("int"));
92   xbt_datadesc_struct_close(desc);
93
94   xbt_assert(sizeof(e_smx_simcall_t)==sizeof(int),
95       "I was assuming that e_smx_simcall_t is of the same size than integer, but it's not true: it's %zu (int:%zu)\n",
96       sizeof(e_smx_simcall_t),sizeof(int));
97   xbt_datadesc_copy("e_smx_simcall_t", xbt_datadesc_by_name("int"));
98 }
99
100 static void parse_from_file(const char *name){
101   int in=open(name,O_RDONLY);
102   if (in==-1){
103     fprintf(stderr,"Cannot read structure file from %s: %s\n",name,strerror(errno));
104     exit(1);
105   }
106
107   xbt_strbuff_t strbuff = xbt_strbuff_new();
108   int r;
109   do {
110     char buffer[1024];
111     r = read(in,&buffer,1023);
112     buffer[r] = '\0';
113     xbt_strbuff_append(strbuff,buffer);
114   } while (r!=0);
115
116   printf("File %s content:\n%s\n",name,strbuff->data);
117   xbt_datadesc_parse(name,strbuff->data);
118
119 }
120
121 int main(int argc, char** argv) {
122   xbt_init(&argc, argv);
123   define_types();
124
125   if (argc<3) {
126     fprintf(stderr,"Usage: %s struct-file offset1 offset2 ...\n",argv[0]);
127     exit(1);
128   }
129
130 //  parse_from_file("s_smx_simcall_t");
131   parse_from_file(argv[1]);
132
133   int cpt;
134   xbt_datadesc_type_t type = xbt_datadesc_by_name(argv[1]);
135   for (cpt=2;cpt<argc;cpt++) {
136     int offset = atoi(argv[cpt]);
137     unsigned int cursor;
138     xbt_dd_cat_field_t field;
139     int found = 0;
140
141     printf ("Offset: %d in struct %s (there is %lu fields)\n",
142         offset, type->name, xbt_dynar_length(type->category.struct_data.fields));
143     xbt_dynar_foreach(type->category.struct_data.fields,cursor,field) {
144       if (field->offset[GRAS_THISARCH]<= offset&&
145           field->offset[GRAS_THISARCH]+field->type->size[GRAS_THISARCH] >= offset) {
146         found = 1;
147         printf("This offset is somewhere in field %s, which starts at offset %ld and is of size %ld\n",
148               field->name,field->offset[GRAS_THISARCH],field->type->size[GRAS_THISARCH]);
149
150       }
151     }
152     if (!found) {
153
154       printf("Damnit, the structure is too short to find the the field (last field %s was at offset %ld, with size %ld). Weird.\n",
155           field->name,field->offset[GRAS_THISARCH],field->type->size[GRAS_THISARCH]);
156     }
157   }
158   return 0;
159 }
160
161
162