static int there_is_a_visible_common_named (char *comname) { SAVED_F77_COMMON_PTR the_common; struct frame_info *fi; char *funname = 0; struct symbol *func; if (comname == NULL) error (_("Cannot deal with NULL common name!")); fi = deprecated_selected_frame; if (fi == NULL) error (_("No frame selected")); /* The following is generally ripped off from stack.c's routine print_frame_info() */ func = find_pc_function (fi->pc); if (func) { /* In certain pathological cases, the symtabs give the wrong function (when we are in the first function in a file which is compiled without debugging symbols, the previous function is compiled with debugging symbols, and the "foo.o" symbol that is supposed to tell us where the file with debugging symbols ends has been truncated by ar because it is longer than 15 characters). So look in the minimal symbol tables as well, and if it comes up with a larger address for the function use that instead. I don't think this can ever cause any problems; there shouldn't be any minimal symbols in the middle of a function. FIXME: (Not necessarily true. What about text labels) */ struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (fi->pc); /* APPLE LOCAL begin address ranges */ if (msymbol != NULL && (SYMBOL_VALUE_ADDRESS (msymbol) > BLOCK_LOWEST_PC (SYMBOL_BLOCK_VALUE (func)))) /* APPLE LOCAL end address ranges */ funname = DEPRECATED_SYMBOL_NAME (msymbol); else funname = DEPRECATED_SYMBOL_NAME (func); } else { struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (fi->pc); if (msymbol != NULL) funname = DEPRECATED_SYMBOL_NAME (msymbol); } the_common = find_common_for_function (comname, funname); return (the_common ? 1 : 0); }
static void info_common_command (char *comname, int from_tty) { SAVED_F77_COMMON_PTR the_common; COMMON_ENTRY_PTR entry; struct frame_info *fi; char *funname = 0; struct symbol *func; /* We have been told to display the contents of F77 COMMON block supposedly visible in this function. Let us first make sure that it is visible and if so, let us display its contents */ fi = deprecated_selected_frame; if (fi == NULL) error ("No frame selected"); /* The following is generally ripped off from stack.c's routine print_frame_info() */ func = find_pc_function (get_frame_pc (fi)); if (func) { /* In certain pathological cases, the symtabs give the wrong function (when we are in the first function in a file which is compiled without debugging symbols, the previous function is compiled with debugging symbols, and the "foo.o" symbol that is supposed to tell us where the file with debugging symbols ends has been truncated by ar because it is longer than 15 characters). So look in the minimal symbol tables as well, and if it comes up with a larger address for the function use that instead. I don't think this can ever cause any problems; there shouldn't be any minimal symbols in the middle of a function. FIXME: (Not necessarily true. What about text labels) */ struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (get_frame_pc (fi)); if (msymbol != NULL && (SYMBOL_VALUE_ADDRESS (msymbol) > BLOCK_START (SYMBOL_BLOCK_VALUE (func)))) funname = DEPRECATED_SYMBOL_NAME (msymbol); else funname = DEPRECATED_SYMBOL_NAME (func); } else { struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (get_frame_pc (fi)); if (msymbol != NULL) funname = DEPRECATED_SYMBOL_NAME (msymbol); } /* If comname is NULL, we assume the user wishes to see the which COMMON blocks are visible here and then return */ if (comname == 0) { list_all_visible_commons (funname); return; } the_common = find_common_for_function (comname, funname); if (the_common) { if (strcmp (comname, BLANK_COMMON_NAME_LOCAL) == 0) printf_filtered ("Contents of blank COMMON block:\n"); else printf_filtered ("Contents of F77 COMMON block '%s':\n", comname); printf_filtered ("\n"); entry = the_common->entries; while (entry != NULL) { printf_filtered ("%s = ", DEPRECATED_SYMBOL_NAME (entry->symbol)); print_variable_value (entry->symbol, fi, gdb_stdout); printf_filtered ("\n"); entry = entry->next; } } else printf_filtered ("Cannot locate the common block %s in function '%s'\n", comname, funname); }