From 77636dea0a8b2f31d21b86b9013a123dcbb10e05 Mon Sep 17 00:00:00 2001 From: Fred Fish Date: Fri, 23 Jan 1998 15:44:12 +0000 Subject: [PATCH] * config/d10v/tm-d10v.h (CALL_DUMMY): Define as "{ 0 }". (TARGET_READ_FP): Define to d10v_read_fp rather than d10v_read_sp. (TARGET_WRITE_FP): Define to d10v_write_fp rather than d10v_write_sp. (d10v_write_fp, d10v_read_fp): Add prototypes. * symtab.c (decode_line_1): Remove assignment of sals[0].pc field. * symfile.c (simple_overlay_update, simple_overlay_update_1): Ignore the size of overlay sections. This check is redundant anyway. * printcmd.c (print_frame_args): Ditto. * valops.c (value_fetch_lazy): Ditto. * values.c (unpack_long): Ditto. * d10v-tdep.c (d10v_frame_chain, d10v_frame_find_saved_regs, d10v_init_extra_frame_info): Fix some minor bugs so the finish command works properly. (show_regs): Change num1 and num2 types from "long long" to "LONGEST". (d10v_read_fp, d10v_write_fp): New functions. (d10v_push_arguments): Remove unneeded assigns to "val" and "contents". (d10v_push_arguments): Fix for pointers and structs. (d10v_extract_return_value): Fix for pointers and chars. --- gdb/ChangeLog | 21 +++++ gdb/ChangeLog-gdbtk | 5 ++ gdb/Makefile.in | 23 ++--- gdb/config/d10v/tm-d10v.h | 8 +- gdb/d10v-tdep.c | 67 ++++++++++++--- gdb/symfile.c | 171 +++++++++++++++++++++++++++----------- gdb/symtab.c | 1 - gdb/values.c | 4 + 8 files changed, 224 insertions(+), 76 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 7e09828fd7..7e09771886 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,24 @@ +Fri Jan 23 07:47:06 1998 Fred Fish + + * config/d10v/tm-d10v.h (CALL_DUMMY): Define as "{ 0 }". + (TARGET_READ_FP): Define to d10v_read_fp rather than d10v_read_sp. + (TARGET_WRITE_FP): Define to d10v_write_fp rather than d10v_write_sp. + (d10v_write_fp, d10v_read_fp): Add prototypes. + * symtab.c (decode_line_1): Remove assignment of sals[0].pc field. + * symfile.c (simple_overlay_update, simple_overlay_update_1): + Ignore the size of overlay sections. This check is redundant anyway. + * printcmd.c (print_frame_args): Ditto. + * valops.c (value_fetch_lazy): Ditto. + * values.c (unpack_long): Ditto. + * d10v-tdep.c (d10v_frame_chain, d10v_frame_find_saved_regs, + d10v_init_extra_frame_info): Fix some minor bugs so the finish command + works properly. + (show_regs): Change num1 and num2 types from "long long" to "LONGEST". + (d10v_read_fp, d10v_write_fp): New functions. + (d10v_push_arguments): Remove unneeded assigns to "val" and "contents". + (d10v_push_arguments): Fix for pointers and structs. + (d10v_extract_return_value): Fix for pointers and chars. + Tue Jan 20 18:53:18 1998 Stan Shebs * configure.tgt (i386-*-mach*, m88*-*-mach3*): Remove config diff --git a/gdb/ChangeLog-gdbtk b/gdb/ChangeLog-gdbtk index a1c0486428..55bdd34b1b 100644 --- a/gdb/ChangeLog-gdbtk +++ b/gdb/ChangeLog-gdbtk @@ -1,3 +1,8 @@ +Fri Jan 23 07:47:06 1998 Fred Fish + + * Makefile.in (uninstall): Remove installed gdbtcl dir, if one + was installed. + Thu Jan 15 12:42:28 1998 Keith Seitz * gdbtk.c (gdb_immediate_command): New function which does not buffer any diff --git a/gdb/Makefile.in b/gdb/Makefile.in index 3e2c7d9e16..1eb6644a26 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -578,16 +578,16 @@ install-only: fi ; \ $(INSTALL_PROGRAM) gdb$(EXEEXT) $(bindir)/$$transformed_name$(EXEEXT) ; \ $(INSTALL_DATA) $(srcdir)/gdb.1 $(man1dir)/$$transformed_name.1 - # start-sanitize-gdbtk - $(SHELL) $(srcdir)/../mkinstalldirs $(datadir)/gdbtcl ; \ - $(SHELL) $(srcdir)/../mkinstalldirs \ - $(datadir)/gdbtcl/images \ - $(datadir)/gdbtcl/images2 ; \ - cd $(srcdir)/gdbtcl2 ; \ - for i in *.tcl images/*.gif images2/*.gif tclIndex; \ - do \ - $(INSTALL_DATA) $$i $(datadir)/gdbtcl/$$i ; \ - done ; + # start-sanitize-gdbtk + $(SHELL) $(srcdir)/../mkinstalldirs $(datadir)/gdbtcl ; \ + $(SHELL) $(srcdir)/../mkinstalldirs \ + $(datadir)/gdbtcl/images \ + $(datadir)/gdbtcl/images2 ; \ + cd $(srcdir)/gdbtcl2 ; \ + for i in *.tcl images/*.gif images2/*.gif tclIndex; \ + do \ + $(INSTALL_DATA) $$i $(datadir)/gdbtcl/$$i ; \ + done ; # end-sanitize-gdbtk @$(MAKE) DO=install "DODIRS=$(SUBDIRS)" $(FLAGS_TO_PASS) subdir_do @@ -600,6 +600,9 @@ uninstall: force true ; \ fi ; \ rm -f $(bindir)/$$transformed_name$(EXEEXT) $(man1dir)/$$transformed_name.1 + # start-sanitize-gdbtk + rm -rf $(datadir)/gdbtcl + # end-sanitize-gdbtk @$(MAKE) DO=uninstall "DODIRS=$(SUBDIRS)" $(FLAGS_TO_PASS) subdir_do # We do this by grepping through sources. If that turns out to be too slow, diff --git a/gdb/config/d10v/tm-d10v.h b/gdb/config/d10v/tm-d10v.h index 5f248b19ff..ca1ef07eec 100644 --- a/gdb/config/d10v/tm-d10v.h +++ b/gdb/config/d10v/tm-d10v.h @@ -236,7 +236,7 @@ When it hits the breakpoint, clear the break point and pop the old register cont off the stack. */ -#define CALL_DUMMY { } +#define CALL_DUMMY { 0 } #define PUSH_DUMMY_FRAME #define CALL_DUMMY_START_OFFSET 0 #define CALL_DUMMY_LOCATION AT_ENTRY_POINT @@ -286,11 +286,13 @@ void d10v_write_pc PARAMS ((CORE_ADDR val, int pid)); CORE_ADDR d10v_read_pc PARAMS ((int pid)); void d10v_write_sp PARAMS ((CORE_ADDR val)); CORE_ADDR d10v_read_sp PARAMS ((void)); +void d10v_write_fp PARAMS ((CORE_ADDR val)); +CORE_ADDR d10v_read_fp PARAMS ((void)); #define TARGET_READ_PC(pid) d10v_read_pc (pid) #define TARGET_WRITE_PC(val,pid) d10v_write_pc (val, pid) -#define TARGET_READ_FP() d10v_read_sp () -#define TARGET_WRITE_FP(val) d10v_write_sp (val) +#define TARGET_READ_FP() d10v_read_fp () +#define TARGET_WRITE_FP(val) d10v_write_fp (val) #define TARGET_READ_SP() d10v_read_sp () #define TARGET_WRITE_SP(val) d10v_write_sp (val) diff --git a/gdb/d10v-tdep.c b/gdb/d10v-tdep.c index 9ca62a5980..5b9e980e8b 100644 --- a/gdb/d10v-tdep.c +++ b/gdb/d10v-tdep.c @@ -199,7 +199,7 @@ d10v_frame_chain (frame) d10v_frame_find_saved_regs (frame, &fsr); - if (frame->return_pc == IMEM_START) + if (frame->return_pc == IMEM_START || inside_entry_file(frame->return_pc)) return (CORE_ADDR)0; if (!fsr.regs[FP_REGNUM]) @@ -369,9 +369,9 @@ d10v_frame_find_saved_regs (fi, fsr) } if (fsr->regs[LR_REGNUM]) - fi->return_pc = ((read_memory_unsigned_integer(fsr->regs[LR_REGNUM],2) - 1) << 2) | IMEM_START; + fi->return_pc = (read_memory_unsigned_integer(fsr->regs[LR_REGNUM],2) << 2) | IMEM_START; else - fi->return_pc = ((read_register(LR_REGNUM) - 1) << 2) | IMEM_START; + fi->return_pc = (read_register(LR_REGNUM) << 2) | IMEM_START; /* th SP is not normally (ever?) saved, but check anyway */ if (!fsr->regs[SP_REGNUM]) @@ -395,10 +395,6 @@ d10v_init_extra_frame_info (fromleaf, fi) struct frame_info *fi; { struct frame_saved_regs dummy; - - if (fi->next && ((fi->pc & 0xffff) == 0)) - fi->pc = fi->next->return_pc; - d10v_frame_find_saved_regs (fi, &dummy); } @@ -407,7 +403,7 @@ show_regs (args, from_tty) char *args; int from_tty; { - long long num1, num2; + LONGEST num1, num2; printf_filtered ("PC=%04x (0x%x) PSW=%04x RPT_S=%04x RPT_E=%04x RPT_C=%04x\n", read_register (PC_REGNUM), (read_register (PC_REGNUM) << 2) + IMEM_START, read_register (PSW_REGNUM), @@ -497,6 +493,19 @@ d10v_write_sp (val) write_register (SP_REGNUM, (LONGEST)(val & 0xffff)); } +void +d10v_write_fp (val) + CORE_ADDR val; +{ + write_register (FP_REGNUM, (LONGEST)(val & 0xffff)); +} + +CORE_ADDR +d10v_read_fp () +{ + return (read_register(FP_REGNUM) | DMEM_START); +} + CORE_ADDR d10v_fix_call_dummy (dummyname, start_sp, fun, nargs, args, type, gcc_p) char *dummyname; @@ -563,7 +572,6 @@ d10v_push_arguments (nargs, args, sp, struct_return, struct_addr) struct type *arg_type = check_typedef (VALUE_TYPE (arg)); len = TYPE_LENGTH (arg_type); contents = VALUE_CONTENTS(arg); - val = extract_signed_integer (contents, len); if (len > 4) { /* put on stack and pass pointers */ @@ -580,8 +588,6 @@ d10v_push_arguments (nargs, args, sp, struct_return, struct_addr) value_ptr arg = args[i]; struct type *arg_type = check_typedef (VALUE_TYPE (arg)); len = TYPE_LENGTH (arg_type); - contents = VALUE_CONTENTS(arg); - val = extract_signed_integer (contents, len); if (len > 4) { /* use a pointer to previously saved data */ @@ -597,6 +603,25 @@ d10v_push_arguments (nargs, args, sp, struct_return, struct_addr) } else { + contents = VALUE_CONTENTS(arg); + val = extract_signed_integer (contents, len); + /* printf("push: type=%d len=%d val=0x%x\n",arg_type->code,len,val); */ + if (arg_type->code == TYPE_CODE_PTR) + { + if ( (val & 0x3000000) == 0x1000000) + { + /* function pointer */ + val = (val & 0x3FFFF) >> 2; + len = 2; + } + else + { + /* data pointer */ + val &= 0xFFFF; + len = 2; + } + } + if (regnum < 6 ) { if (len == 4) @@ -649,7 +674,25 @@ d10v_extract_return_value (valtype, regbuf, valbuf) char regbuf[REGISTER_BYTES]; char *valbuf; { - memcpy (valbuf, regbuf + REGISTER_BYTE (2), TYPE_LENGTH (valtype)); + int len; + /* printf("RET: VALTYPE=%d len=%d r2=0x%x\n",valtype->code, TYPE_LENGTH (valtype), (int)*(short *)(regbuf+REGISTER_BYTE(2))); */ + if (valtype->code == TYPE_CODE_PTR) + { + short snum; + snum = (short)extract_address (regbuf + REGISTER_BYTE (2), 2); + store_address ( valbuf, 4, D10V_MAKE_DADDR(snum)); + } + else + { + len = TYPE_LENGTH (valtype); + if (len == 1) + { + unsigned short c = extract_unsigned_integer (regbuf + REGISTER_BYTE (2), 2); + store_unsigned_integer (valbuf, 1, c); + } + else + memcpy (valbuf, regbuf + REGISTER_BYTE (2), len); + } } /* The following code implements access to, and display of, the D10V's diff --git a/gdb/symfile.c b/gdb/symfile.c index 650c4c3b26..936ffc9dd5 100644 --- a/gdb/symfile.c +++ b/gdb/symfile.c @@ -52,6 +52,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #define O_BINARY 0 #endif +int (*ui_load_progress_hook) PARAMS ((char *, unsigned long)); + /* Global variables owned by this file */ int readnow_symbol_files; /* Read full symbols immediately */ @@ -998,41 +1000,62 @@ generic_load (filename, from_tty) for (s = loadfile_bfd->sections; s; s = s->next) { if (s->flags & SEC_LOAD) - { - bfd_size_type size; - - size = bfd_get_section_size_before_reloc (s); - if (size > 0) - { - char *buffer; - struct cleanup *old_chain; - bfd_vma lma; - - data_count += size; - - buffer = xmalloc (size); - old_chain = make_cleanup (free, buffer); - - lma = s->lma; - lma += load_offset; - - /* Is this really necessary? I guess it gives the user something - to look at during a long download. */ - printf_filtered ("Loading section %s, size 0x%lx lma ", - bfd_get_section_name (loadfile_bfd, s), - (unsigned long) size); - print_address_numeric (lma, 1, gdb_stdout); - printf_filtered ("\n"); - - bfd_get_section_contents (loadfile_bfd, s, buffer, 0, size); - - if (target_write_memory (lma, buffer, size) != 0) - error ("Memory access error while loading section %s.", - bfd_get_section_name (loadfile_bfd, s)); - - do_cleanups (old_chain); - } - } + { + bfd_size_type size; + + size = bfd_get_section_size_before_reloc (s); + if (size > 0) + { + char *buffer; + struct cleanup *old_chain; + bfd_vma lma; + unsigned long l = size / 100; + int err; + char *sect; + unsigned long sent; + unsigned long len; + + l = l > 100 ? l : 100; + data_count += size; + + buffer = xmalloc (size); + old_chain = make_cleanup (free, buffer); + + lma = s->lma; + lma += load_offset; + + /* Is this really necessary? I guess it gives the user something + to look at during a long download. */ + printf_filtered ("Loading section %s, size 0x%lx lma ", + bfd_get_section_name (loadfile_bfd, s), + (unsigned long) size); + print_address_numeric (lma, 1, gdb_stdout); + printf_filtered ("\n"); + + bfd_get_section_contents (loadfile_bfd, s, buffer, 0, size); + + sect = bfd_get_section_name (loadfile_bfd, s); + sent = 0; + do + { + len = (size - sent) < l ? (size - sent) : l; + sent += len; + err = target_write_memory (lma, buffer, len); + if (ui_load_progress_hook) + if (ui_load_progress_hook (sect, sent)) + error ("Canceled the download"); + lma += len; + buffer += len; + } + while (err == 0 && sent < size); + + if (err != 0) + error ("Memory access error while loading section %s.", + bfd_get_section_name (loadfile_bfd, s)); + + do_cleanups (old_chain); + } + } } end_time = time (NULL); @@ -1424,6 +1447,8 @@ allocate_symtab (filename, objfile) &objfile -> symbol_obstack); symtab -> fullname = NULL; symtab -> language = deduce_language_from_filename (filename); + symtab -> debugformat = obsavestring ("unknown", 7, + &objfile -> symbol_obstack); /* Hook it to the objfile it comes from */ @@ -1460,15 +1485,54 @@ allocate_psymtab (filename, objfile) &objfile -> psymbol_obstack); psymtab -> symtab = NULL; - /* Hook it to the objfile it comes from */ + /* Prepend it to the psymtab list for the objfile it belongs to. + Psymtabs are searched in most recent inserted -> least recent + inserted order. */ psymtab -> objfile = objfile; psymtab -> next = objfile -> psymtabs; objfile -> psymtabs = psymtab; +#if 0 + { + struct partial_symtab **prev_pst; + psymtab -> objfile = objfile; + psymtab -> next = NULL; + prev_pst = &(objfile -> psymtabs); + while ((*prev_pst) != NULL) + prev_pst = &((*prev_pst) -> next); + (*prev_pst) = psymtab; + } +#endif return (psymtab); } +void +discard_psymtab (pst) + struct partial_symtab *pst; +{ + struct partial_symtab **prev_pst; + + /* From dbxread.c: + Empty psymtabs happen as a result of header files which don't + have any symbols in them. There can be a lot of them. But this + check is wrong, in that a psymtab with N_SLINE entries but + nothing else is not empty, but we don't realize that. Fixing + that without slowing things down might be tricky. */ + + /* First, snip it out of the psymtab chain */ + + prev_pst = &(pst->objfile->psymtabs); + while ((*prev_pst) != pst) + prev_pst = &((*prev_pst)->next); + (*prev_pst) = pst->next; + + /* Next, put it on a free list for recycling */ + + pst->next = pst->objfile->free_psymtabs; + pst->objfile->free_psymtabs = pst; +} + /* Reset all data structures in gdb which may contain references to symbol table data. */ @@ -1795,14 +1859,21 @@ init_psymbol_list (objfile, total_symbols) objfile -> global_psymbols.size = total_symbols / 10; objfile -> static_psymbols.size = total_symbols / 10; - objfile -> global_psymbols.next = - objfile -> global_psymbols.list = (struct partial_symbol **) - xmmalloc (objfile -> md, objfile -> global_psymbols.size - * sizeof (struct partial_symbol *)); - objfile -> static_psymbols.next = - objfile -> static_psymbols.list = (struct partial_symbol **) - xmmalloc (objfile -> md, objfile -> static_psymbols.size - * sizeof (struct partial_symbol *)); + + if (objfile -> global_psymbols.size > 0) + { + objfile -> global_psymbols.next = + objfile -> global_psymbols.list = (struct partial_symbol **) + xmmalloc (objfile -> md, (objfile -> global_psymbols.size + * sizeof (struct partial_symbol *))); + } + if (objfile -> static_psymbols.size > 0) + { + objfile -> static_psymbols.next = + objfile -> static_psymbols.list = (struct partial_symbol **) + xmmalloc (objfile -> md, (objfile -> static_psymbols.size + * sizeof (struct partial_symbol *))); + } } /* OVERLAYS: @@ -2456,14 +2527,14 @@ simple_overlay_update_1 (osect) size = bfd_get_section_size_before_reloc (osect->the_bfd_section); for (i = 0; i < cache_novlys; i++) if (cache_ovly_table[i][VMA] == osect->the_bfd_section->vma && - cache_ovly_table[i][LMA] == osect->the_bfd_section->lma && - cache_ovly_table[i][SIZE] == size) + cache_ovly_table[i][LMA] == osect->the_bfd_section->lma /* && + cache_ovly_table[i][SIZE] == size */) { read_target_int_array (cache_ovly_table_base + i * TARGET_INT_BYTES, (int *) &cache_ovly_table[i], 4); if (cache_ovly_table[i][VMA] == osect->the_bfd_section->vma && - cache_ovly_table[i][LMA] == osect->the_bfd_section->lma && - cache_ovly_table[i][SIZE] == size) + cache_ovly_table[i][LMA] == osect->the_bfd_section->lma /* && + cache_ovly_table[i][SIZE] == size */) { osect->ovly_mapped = cache_ovly_table[i][MAPPED]; return 1; @@ -2518,8 +2589,8 @@ simple_overlay_update (osect) size = bfd_get_section_size_before_reloc (osect->the_bfd_section); for (i = 0; i < cache_novlys; i++) if (cache_ovly_table[i][VMA] == osect->the_bfd_section->vma && - cache_ovly_table[i][LMA] == osect->the_bfd_section->lma && - cache_ovly_table[i][SIZE] == size) + cache_ovly_table[i][LMA] == osect->the_bfd_section->lma /* && + cache_ovly_table[i][SIZE] == size */) { /* obj_section matches i'th entry in ovly_table */ osect->ovly_mapped = cache_ovly_table[i][MAPPED]; break; /* finished with inner for loop: break out */ diff --git a/gdb/symtab.c b/gdb/symtab.c index e79b9b5a30..9a8201c751 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -2102,7 +2102,6 @@ decode_line_1 (argptr, funfirstline, default_symtab, default_line, canonical) xmalloc (sizeof (struct symtab_and_line)); values.nelts = 1; values.sals[0] = find_pc_line (pc, 0); - values.sals[0].pc = pc; return values; } diff --git a/gdb/values.c b/gdb/values.c index 0ffd5a63cb..69c19a6399 100644 --- a/gdb/values.c +++ b/gdb/values.c @@ -634,6 +634,10 @@ unpack_long (type, valaddr) case TYPE_CODE_REF: /* Assume a CORE_ADDR can fit in a LONGEST (for now). Not sure whether we want this to be true eventually. */ +#ifdef GDB_TARGET_IS_D10V + if (len == 2) + return D10V_MAKE_DADDR(extract_address (valaddr, len)); +#endif return extract_address (valaddr, len); case TYPE_CODE_MEMBER: -- 2.34.1