From mboxrd@z Thu Jan 1 00:00:00 1970 From: robert somerville To: David B Anderson , gdb@sourceware.cygnus.com, somervil@cadvision.com Subject: Re: does GDB support IRIX 64 bit executables? Date: Thu, 01 Jun 2000 15:06:00 -0000 Message-id: <3936DE65.129C044B@cadvision.com> References: <200006011943.MAA35397@quasar.engr.sgi.com> X-SW-Source: 2000-06/msg00008.html dave , i think the lotus notes mail tool might have failed me , will resend my message to you again, my apologies: *************************************************** i got this patch from : Benjamin Gamsa the patch installs fairly well on gdb5.0 with a few rejects you have to hand edit: -using gcc it seems to generate a GDB that works well on 64 bit executables (so far at least). I would recommend that you contact him for more details on patch, -thanks bob -- robert somerville Geophysicist / Geophysical Programmer diff -rc -x CVS -x RCS -x *.o -x *.info* -x *.html* -x *.elc -x *.dvi -x *.orig -x *~ gdb-4.17.85-orig/gdb/config/mips/irix6-64.mt gdb-4.17.85/gdb/config/mips/irix6-64.mt *** gdb-4.17.85-orig/gdb/config/mips/irix6-64.mt Wed Mar 3 15:16:36 1999 --- gdb-4.17.85/gdb/config/mips/irix6-64.mt Wed Mar 3 11:41:24 1999 *************** *** 0 **** --- 1,3 ---- + # Target: MIPS SGI running Irix 6 for 64 bits + TDEPFILES= mips-tdep.o + TM_FILE= tm-irix6-64.h diff -rc -x CVS -x RCS -x *.o -x *.info* -x *.html* -x *.elc -x *.dvi -x *.orig -x *~ gdb-4.17.85-orig/gdb/config/mips/tm-irix6-64.h gdb-4.17.85/gdb/config/mips/tm-irix6-64.h *** gdb-4.17.85-orig/gdb/config/mips/tm-irix6-64.h Wed Mar 3 15:16:36 1999 --- gdb-4.17.85/gdb/config/mips/tm-irix6-64.h Wed Mar 3 14:59:27 1999 *************** *** 0 **** --- 1,80 ---- + /* Copyright (C) 1996 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + + #define TARGET_BYTE_ORDER_DEFAULT BIG_ENDIAN + + #define GDB_TARGET_IS_MIPS64 1 + + /* Use eight byte registers. */ + #define MIPS_REGSIZE 8 + + /* define 8 byte register type */ + #define REGISTER_VIRTUAL_TYPE(N) \ + (((N) >= FP0_REGNUM && (N) < FP0_REGNUM+32) \ + ? builtin_type_double : builtin_type_long_long) \ + + /* Load double words in CALL_DUMMY. */ + #define OP_LDFPR 065 /* ldc1 */ + #define OP_LDGPR 067 /* ld */ + + /* define sizes for 64-bit data types */ + #define TARGET_LONG_BIT 64 + #define TARGET_LONG_LONG_BIT 64 + #define TARGET_PTR_BIT 64 + + + #include "mips/tm-irix5.h" + + /* from tm-irix5, but remove extra + 4 at end since reg are 8 bytes */ + + #undef SIGFRAME_PC_OFF + #define SIGFRAME_PC_OFF (SIGFRAME_BASE + 2 * 4) + #undef SIGFRAME_REGSAVE_OFF + #define SIGFRAME_REGSAVE_OFF (SIGFRAME_BASE + 2 * 4 + 8) + #undef SIGFRAME_FPREGSAVE_OFF + #define SIGFRAME_FPREGSAVE_OFF (SIGFRAME_BASE + 2 * 4 + 8 + 32 * 8) + + /* undo tm-irix5 mis-conception of the types of registers */ + + #undef REGISTER_VIRTUAL_TYPE + #define REGISTER_VIRTUAL_TYPE(N) \ + (((N) >= FP0_REGNUM && (N) < FP0_REGNUM+32) ? builtin_type_double \ + : ((N) == 32 /*SR*/) ? builtin_type_uint32 \ + : ((N) >= 70 && (N) <= 89) ? builtin_type_uint64 \ + : builtin_type_uint64) + + /* keep same basic registers, but change names to conform to n32/64 bit + conventions. */ + + #undef REGISTER_NAMES + #define REGISTER_NAMES \ + { "zero", "at", "v0", "v1", "a0", "a1", "a2", "a3", \ + "a4", "a5", "a6", "a7", "t0", "t1", "t2", "t3", \ + "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", \ + "t8", "t9", "k0", "k1", "gp", "sp", "fp", "ra", \ + "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", \ + "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", \ + "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",\ + "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",\ + "pc", "cause", "bad", "hi", "lo", "fsr", "fir" \ + } + + /* not sure about the sigframe stuff... just guessing we remove extra +4 */ + + #undef SIGFRAME_FPREGSAVE_OFF + #define SIGFRAME_FPREGSAVE_OFF (SIGFRAME_BASE + 3 * 4 + 32 * 4) diff -rc -x CVS -x RCS -x *.o -x *.info* -x *.html* -x *.elc -x *.dvi -x *.orig -x *~ gdb-4.17.85-orig/gdb/configure.tgt gdb-4.17.85/gdb/configure.tgt *** gdb-4.17.85-orig/gdb/configure.tgt Wed Feb 24 15:57:08 1999 --- gdb-4.17.85/gdb/configure.tgt Wed Mar 3 11:41:24 1999 *************** *** 189,195 **** mips*-little-*) gdb_target=littlemips ;; mips*-*-lnews*) gdb_target=embedl ;; mips*-sgi-irix5*) gdb_target=irix5 ;; ! mips*-sgi-irix6*) gdb_target=irix5 ;; mips*-sgi-*) gdb_target=irix3 ;; mips*-sony-*) gdb_target=bigmips ;; mips*-*-mach3*) gdb_target=mipsm3 ;; --- 189,195 ---- mips*-little-*) gdb_target=littlemips ;; mips*-*-lnews*) gdb_target=embedl ;; mips*-sgi-irix5*) gdb_target=irix5 ;; ! mips*-sgi-irix6*) gdb_target=irix6-64 ;; mips*-sgi-*) gdb_target=irix3 ;; mips*-sony-*) gdb_target=bigmips ;; mips*-*-mach3*) gdb_target=mipsm3 ;; diff -rc -x CVS -x RCS -x *.o -x *.info* -x *.html* -x *.elc -x *.dvi -x *.orig -x *~ gdb-4.17.85-orig/gdb/dwarf2read.c gdb-4.17.85/gdb/dwarf2read.c *** gdb-4.17.85-orig/gdb/dwarf2read.c Mon Jan 11 16:51:37 1999 --- gdb-4.17.85/gdb/dwarf2read.c Wed Mar 3 21:56:43 1999 *************** *** 52,58 **** unsigned short version; /* version number -- 2 for DWARF version 2 */ unsigned int abbrev_offset; /* offset into .debug_abbrev section */ ! unsigned char addr_size; /* byte size of an address -- 4 */ } _COMP_UNIT_HEADER; #define _ACTUAL_COMP_UNIT_HEADER_SIZE 11 --- 52,58 ---- unsigned short version; /* version number -- 2 for DWARF version 2 */ unsigned int abbrev_offset; /* offset into .debug_abbrev section */ ! unsigned char addr_size; /* byte size of an address -- 4 or 8 */ } _COMP_UNIT_HEADER; #define _ACTUAL_COMP_UNIT_HEADER_SIZE 11 *************** *** 926,944 **** obstack_init (&dwarf2_tmp_obstack); back_to = make_cleanup (dwarf2_free_tmp_obstack, NULL); while ((unsigned int) (info_ptr - dwarf_info_buffer) ! + ((info_ptr - dwarf_info_buffer) % 4) < dwarf_info_size) { beg_of_comp_unit = info_ptr; ! cu_header.length = read_4_bytes (abfd, info_ptr); ! info_ptr += 4; cu_header.version = read_2_bytes (abfd, info_ptr); info_ptr += 2; ! cu_header.abbrev_offset = read_4_bytes (abfd, info_ptr); ! info_ptr += 4; cu_header.addr_size = read_1_byte (abfd, info_ptr); info_ptr += 1; ! address_size = cu_header.addr_size; if (cu_header.version != 2) { --- 926,966 ---- obstack_init (&dwarf2_tmp_obstack); back_to = make_cleanup (dwarf2_free_tmp_obstack, NULL); + /* temporary hack by ben */ + #if GDB_TARGET_IS_MIPS64 + address_size = 8; + #else + address_size = 4; + #endif + while ((unsigned int) (info_ptr - dwarf_info_buffer) ! + ((info_ptr - dwarf_info_buffer) % address_size) < dwarf_info_size) { beg_of_comp_unit = info_ptr; ! if (address_size == 4) { ! cu_header.length = read_4_bytes (abfd, info_ptr); ! info_ptr += 4; ! } else { ! cu_header.length = read_8_bytes (abfd, info_ptr); ! info_ptr += 8; ! } cu_header.version = read_2_bytes (abfd, info_ptr); info_ptr += 2; ! if (address_size == 4) { ! cu_header.abbrev_offset = read_4_bytes (abfd, info_ptr); ! info_ptr += 4; ! } else { ! cu_header.abbrev_offset = read_8_bytes (abfd, info_ptr); ! info_ptr += 8; ! } cu_header.addr_size = read_1_byte (abfd, info_ptr); info_ptr += 1; ! ! if ( address_size != cu_header.addr_size ) { ! error ("Dwarf error: cu address size %ld not what expected (%d)", ! (long)cu_header.addr_size, (long)address_size ); ! return; ! } if (cu_header.version != 2) { *************** *** 1027,1033 **** also happen.) This happens in VxWorks. */ free_named_symtabs (pst->filename); ! info_ptr = beg_of_comp_unit + cu_header.length + 4; } do_cleanups (back_to); } --- 1049,1055 ---- also happen.) This happens in VxWorks. */ free_named_symtabs (pst->filename); ! info_ptr = beg_of_comp_unit + cu_header.length + address_size; } do_cleanups (back_to); } *************** *** 1307,1318 **** make_cleanup ((make_cleanup_func) really_free_pendings, NULL); /* read in the comp_unit header */ ! cu_header.length = read_4_bytes (abfd, info_ptr); ! info_ptr += 4; cu_header.version = read_2_bytes (abfd, info_ptr); info_ptr += 2; ! cu_header.abbrev_offset = read_4_bytes (abfd, info_ptr); ! info_ptr += 4; cu_header.addr_size = read_1_byte (abfd, info_ptr); info_ptr += 1; --- 1329,1350 ---- make_cleanup ((make_cleanup_func) really_free_pendings, NULL); /* read in the comp_unit header */ ! if (address_size == 4) { ! cu_header.length = read_4_bytes (abfd, info_ptr); ! info_ptr += 4; ! } else { ! cu_header.length = read_8_bytes (abfd, info_ptr); ! info_ptr += 8; ! } cu_header.version = read_2_bytes (abfd, info_ptr); info_ptr += 2; ! if (address_size == 4) { ! cu_header.abbrev_offset = read_4_bytes (abfd, info_ptr); ! info_ptr += 4; ! } else { ! cu_header.abbrev_offset = read_8_bytes (abfd, info_ptr); ! info_ptr += 8; ! } cu_header.addr_size = read_1_byte (abfd, info_ptr); info_ptr += 1; *************** *** 1887,1893 **** and create blank accessibility bitfields if necessary. */ TYPE_NFIELDS (type) = nfields; TYPE_FIELDS (type) = (struct field *) ! TYPE_ALLOC (type, sizeof (struct field) * nfields); memset (TYPE_FIELDS (type), 0, sizeof (struct field) * nfields); if (fip->non_public_fields) --- 1919,1925 ---- and create blank accessibility bitfields if necessary. */ TYPE_NFIELDS (type) = nfields; TYPE_FIELDS (type) = (struct field *) ! TYPE_ALLOC (type, sizeof (struct field) * nfields); memset (TYPE_FIELDS (type), 0, sizeof (struct field) * nfields); if (fip->non_public_fields) *************** *** 2518,2524 **** else if (attr->form == DW_FORM_udata || attr->form == DW_FORM_data1 || attr->form == DW_FORM_data2 ! || attr->form == DW_FORM_data4) { low = DW_UNSND (attr); } --- 2550,2557 ---- else if (attr->form == DW_FORM_udata || attr->form == DW_FORM_data1 || attr->form == DW_FORM_data2 ! || attr->form == DW_FORM_data4 ! || attr->form == DW_FORM_data8) { low = DW_UNSND (attr); } *************** *** 2544,2550 **** else if (attr->form == DW_FORM_udata || attr->form == DW_FORM_data1 || attr->form == DW_FORM_data2 ! || attr->form == DW_FORM_data4) { high = DW_UNSND (attr); } --- 2577,2584 ---- else if (attr->form == DW_FORM_udata || attr->form == DW_FORM_data1 || attr->form == DW_FORM_data2 ! || attr->form == DW_FORM_data4 ! || attr->form == DW_FORM_data8) { high = DW_UNSND (attr); } *************** *** 3458,3463 **** --- 3492,3501 ---- DW_UNSND (attr) = read_4_bytes (abfd, info_ptr); info_ptr += 4; break; + case DW_FORM_ref8: + DW_UNSND (attr) = read_8_bytes (abfd, info_ptr); + info_ptr += 8; + break; case DW_FORM_ref_udata: DW_UNSND (attr) = read_unsigned_leb128 (abfd, info_ptr, &bytes_read); info_ptr += bytes_read; *************** *** 3811,3823 **** line_ptr = dwarf_line_buffer + offset; /* read in the prologue */ ! lh.total_length = read_4_bytes (abfd, line_ptr); ! line_ptr += 4; line_end = line_ptr + lh.total_length; lh.version = read_2_bytes (abfd, line_ptr); line_ptr += 2; ! lh.prologue_length = read_4_bytes (abfd, line_ptr); ! line_ptr += 4; lh.minimum_instruction_length = read_1_byte (abfd, line_ptr); line_ptr += 1; lh.default_is_stmt = read_1_byte (abfd, line_ptr); --- 3849,3871 ---- line_ptr = dwarf_line_buffer + offset; /* read in the prologue */ ! if (address_size == 4) { ! lh.total_length = read_4_bytes (abfd, line_ptr); ! line_ptr += 4; ! } else { ! lh.total_length = read_8_bytes (abfd, line_ptr); ! line_ptr += 8; ! } line_end = line_ptr + lh.total_length; lh.version = read_2_bytes (abfd, line_ptr); line_ptr += 2; ! if (address_size == 4) { ! lh.prologue_length = read_4_bytes (abfd, line_ptr); ! line_ptr += 4; ! } else { ! lh.prologue_length = read_8_bytes (abfd, line_ptr); ! line_ptr += 8; ! } lh.minimum_instruction_length = read_1_byte (abfd, line_ptr); line_ptr += 1; lh.default_is_stmt = read_1_byte (abfd, line_ptr); *************** *** 3915,3921 **** switch (op_code) { case DW_LNS_extended_op: ! line_ptr += 1; /* ignore length */ extended_op = read_1_byte (abfd, line_ptr); line_ptr += 1; switch (extended_op) --- 3963,3971 ---- switch (op_code) { case DW_LNS_extended_op: ! /* ignore length */ ! read_unsigned_leb128 (abfd, line_ptr, &bytes_read); ! line_ptr += bytes_read; extended_op = read_1_byte (abfd, line_ptr); line_ptr += 1; switch (extended_op) *************** *** 3993,3999 **** basic_block = 1; break; case DW_LNS_const_add_pc: ! address += (255 - lh.opcode_base) / lh.line_range; break; case DW_LNS_fixed_advance_pc: address += read_2_bytes (abfd, line_ptr); --- 4043,4050 ---- basic_block = 1; break; case DW_LNS_const_add_pc: ! address += lh.minimum_instruction_length * ! (255 - lh.opcode_base) / lh.line_range; break; case DW_LNS_fixed_advance_pc: address += read_2_bytes (abfd, line_ptr); *************** *** 4006,4012 **** line += lh.line_base + (adj_opcode % lh.line_range); /* append row to matrix using current values */ record_line (current_subfile, line, address); ! basic_block = 1; } } } --- 4057,4063 ---- line += lh.line_base + (adj_opcode % lh.line_range); /* append row to matrix using current values */ record_line (current_subfile, line, address); ! basic_block = 0; } } } *************** *** 5469,5477 **** --- 5520,5530 ---- case DW_FORM_data1: case DW_FORM_data2: case DW_FORM_data4: + case DW_FORM_data8: case DW_FORM_ref1: case DW_FORM_ref2: case DW_FORM_ref4: + case DW_FORM_ref8: case DW_FORM_udata: case DW_FORM_sdata: fprintf (stderr, "constant: %d", DW_UNSND (&die->attrs[i])); *************** *** 5490,5496 **** case DW_FORM_strp: /* we do not support separate string section yet */ case DW_FORM_indirect: /* we do not handle indirect yet */ - case DW_FORM_data8: /* we do not have 64 bit quantities */ default: fprintf (stderr, "unsupported attribute form: %d.", die->attrs[i].form); --- 5543,5548 ---- *************** *** 5545,5550 **** --- 5597,5603 ---- case DW_FORM_ref1: case DW_FORM_ref2: case DW_FORM_ref4: + case DW_FORM_ref8: case DW_FORM_ref_udata: result = cu_header_offset + DW_UNSND (attr); break; *************** *** 5590,5598 **** current language and the current target machine. */ if (ftypes[typeid] == NULL) ! { ftypes[typeid] = cu_language_defn->la_fund_type (objfile, typeid); ! } return (ftypes[typeid]); } --- 5643,5651 ---- current language and the current target machine. */ if (ftypes[typeid] == NULL) ! { ftypes[typeid] = cu_language_defn->la_fund_type (objfile, typeid); ! } return (ftypes[typeid]); } diff -rc -x CVS -x RCS -x *.o -x *.info* -x *.html* -x *.elc -x *.dvi -x *.orig -x *~ gdb-4.17.85-orig/gdb/irix5-nat.c gdb-4.17.85/gdb/irix5-nat.c *** gdb-4.17.85-orig/gdb/irix5-nat.c Tue Jan 19 12:01:36 1999 --- gdb-4.17.85/gdb/irix5-nat.c Wed Mar 3 15:04:08 1999 *************** *** 466,471 **** --- 466,472 ---- return (1); } + /* LOCAL FUNCTION *************** *** 561,573 **** return NULL; /* Get address of first list entry. */ ! read_memory (debug_base, (char *) &listp, sizeof (struct obj_list *)); ! if (listp == NULL) return NULL; /* Get first list entry. */ - lladdr = (CORE_ADDR) listp; read_memory (lladdr, (char *) &list_old, sizeof (struct obj_list)); /* The first entry in the list is the object file we are debugging, --- 562,573 ---- return NULL; /* Get address of first list entry. */ ! read_memory (debug_base, (char *) &lladdr, sizeof(CORE_ADDR)); ! if (lladdr == NULL) return NULL; /* Get first list entry. */ read_memory (lladdr, (char *) &list_old, sizeof (struct obj_list)); /* The first entry in the list is the object file we are debugging, *************** *** 577,588 **** --- 577,597 ---- #ifdef HANDLE_NEW_OBJ_LIST if (list_old.data == NEW_OBJ_INFO_MAGIC) { + #if GDB_TARGET_IS_MIPS64 + Elf64_Obj_Info list_64; + + read_memory (lladdr, (char *) &list_64, sizeof (Elf64_Obj_Info)); + if (list_64.oi_size != sizeof (Elf64_Obj_Info)) + return NULL; + next_lladdr = (CORE_ADDR) list_64.oi_next; + #else Elf32_Obj_Info list_32; read_memory (lladdr, (char *) &list_32, sizeof (Elf32_Obj_Info)); if (list_32.oi_size != sizeof (Elf32_Obj_Info)) return NULL; next_lladdr = (CORE_ADDR) list_32.oi_next; + #endif } #endif *************** *** 643,648 **** --- 652,665 ---- sizeof (Elf32_Obj_Info)); next_lladdr = (CORE_ADDR) list_32.oi_next; } + else if (lm -> l_variant == OBJ_LIST_64) + { + Elf64_Obj_Info list_64; + status = target_read_memory (lm -> l_lladdr, + (char *) &list_64, + sizeof (Elf64_Obj_Info)); + next_lladdr = (CORE_ADDR) list_64.oi_next; + } #endif if (status != 0 || next_lladdr == 0) *************** *** 690,695 **** --- 707,731 ---- #ifdef HANDLE_NEW_OBJ_LIST if (list_old.data == NEW_OBJ_INFO_MAGIC) { + #if GDB_TARGET_IS_MIPS64 + Elf64_Obj_Info list_64; + + read_memory (lladdr, (char *) &list_64, sizeof (Elf64_Obj_Info)); + if (list_64.oi_size != sizeof (Elf64_Obj_Info)) + return; + new_lm -> l_variant = OBJ_LIST_64; + new_lm -> l_next = (CORE_ADDR) list_64.oi_next; + + target_read_string ((CORE_ADDR) list_64.oi_pathname, + &so_list_ptr -> so_name, + list_64.oi_pathname_len + 1, &errcode); + if (errcode != 0) + memory_error (errcode, (CORE_ADDR) list_64.oi_pathname); + + LM_ADDR (so_list_ptr) = (CORE_ADDR) list_64.oi_ehdr; + LM_OFFSET (so_list_ptr) = + (CORE_ADDR) list_64.oi_ehdr - (CORE_ADDR) list_64.oi_orig_ehdr; + #else Elf32_Obj_Info list_32; read_memory (lladdr, (char *) &list_32, sizeof (Elf32_Obj_Info)); *************** *** 707,712 **** --- 743,749 ---- LM_ADDR (so_list_ptr) = (CORE_ADDR) list_32.oi_ehdr; LM_OFFSET (so_list_ptr) = (CORE_ADDR) list_32.oi_ehdr - (CORE_ADDR) list_32.oi_orig_ehdr; + #endif } else #endif --gBBFr7Ir9EOA20Yy--