+static int compare_local_variables(mc_snapshot_t snapshot1,
+ mc_snapshot_t snapshot2,
+ mc_snapshot_stack_t stack1,
+ mc_snapshot_stack_t stack2, void *heap1,
+ void *heap2)
+{
+ void *start_data_binary = mc_binary_info->start_rw;
+ void *start_data_libsimgrid = mc_libsimgrid_info->start_rw;
+
+ if (!compared_pointers) {
+ compared_pointers =
+ xbt_dynar_new(sizeof(pointers_pair_t), pointers_pair_free_voidp);
+ } else {
+ xbt_dynar_reset(compared_pointers);
+ }
+
+ if (xbt_dynar_length(stack1->local_variables) !=
+ xbt_dynar_length(stack2->local_variables)) {
+ XBT_VERB("Different number of local variables");
+ xbt_dynar_free(&compared_pointers);
+ compared_pointers = NULL;
+ return 1;
+ } else {
+ unsigned int cursor = 0;
+ local_variable_t current_var1, current_var2;
+ int offset1, offset2, res;
+ while (cursor < xbt_dynar_length(stack1->local_variables)) {
+ current_var1 =
+ (local_variable_t) xbt_dynar_get_as(stack1->local_variables, cursor,
+ local_variable_t);
+ current_var2 =
+ (local_variable_t) xbt_dynar_get_as(stack2->local_variables, cursor,
+ local_variable_t);
+ if (strcmp(current_var1->name, current_var2->name) != 0
+ || current_var1->subprogram != current_var1->subprogram
+ || current_var1->ip != current_var2->ip) {
+ xbt_dynar_free(&compared_pointers);
+ // TODO, fix current_varX->subprogram->name to include name if DW_TAG_inlined_subprogram
+ XBT_VERB
+ ("Different name of variable (%s - %s) or frame (%s - %s) or ip (%lu - %lu)",
+ current_var1->name, current_var2->name,
+ current_var1->subprogram->name, current_var2->subprogram->name,
+ current_var1->ip, current_var2->ip);
+ return 1;
+ }
+ offset1 = (char *) current_var1->address - (char *) std_heap;
+ offset2 = (char *) current_var2->address - (char *) std_heap;
+ // TODO, fix current_varX->subprogram->name to include name if DW_TAG_inlined_subprogram
+
+ if (current_var1->region == 1) {
+ dw_type_t subtype = current_var1->type;
+ res =
+ compare_areas_with_type((char *) heap1 + offset1,
+ (char *) heap2 + offset2, snapshot1,
+ snapshot2, subtype, 0, 1,
+ start_data_libsimgrid, 0);
+ } else {
+ dw_type_t subtype = current_var2->type;
+ res =
+ compare_areas_with_type((char *) heap1 + offset1,
+ (char *) heap2 + offset2, snapshot1,
+ snapshot2, subtype, 0, 2, start_data_binary,
+ 0);
+ }
+ if (res == 1) {
+ // TODO, fix current_varX->subprogram->name to include name if DW_TAG_inlined_subprogram
+ XBT_VERB
+ ("Local variable %s (%p - %p) in frame %s is different between snapshots",
+ current_var1->name, (char *) heap1 + offset1,
+ (char *) heap2 + offset2, current_var1->subprogram->name);
+ xbt_dynar_free(&compared_pointers);
+ compared_pointers = NULL;
+ return res;
+ }
+ cursor++;
+ }
+ xbt_dynar_free(&compared_pointers);
+ compared_pointers = NULL;
+ return 0;
+ }