This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Make debug info section relative on IA64


Richard (or anyone on binutils),

I tried to make a patch like you suggested to fix the debug RELOC
problem I am having but I can't seem to get it right.  Can you (or
someone else on the binutils list) look at the following patch and see
if anything looks wrong?  I think it should do what my original patch
does but it just doesn't work.

Originally (no patch) I would start the HP gdb on a C program containing
a floating point divide (causing it to include __divdf3, which is
written in ASM) and get:

	Dwarf Error: bad offset (0xd6) in compilation unit header (offset 0x68 + 6).

Now with this patch I can start gdb fine but if I set a breakpoint on
main, I get:

	warning: (Internal error: pc 0x4000720 in read in psymtab, but not in symtab.)

0x4000720 is the start of main in my 32 bit program, a 64 bit version of
the program has the same problem.

With my original patch, I could start gdb fine and got no warnings when
I set a breakpoint on main and things seemed to work just fine.

Attached is my current attempt to fix this "the right way" and which
gives me the warnings.

Steve Ellcey
sje at cup dot hp dot com


*** src.orig/gas/dwarf2dbg.c	Thu Mar  6 16:19:02 2003
--- src/gas/dwarf2dbg.c	Thu Mar  6 17:02:52 2003
***************
*** 44,49 ****
--- 44,54 ----
  #include "dwarf2dbg.h"
  #include <filenames.h>
  
+ #ifndef TC_DWARF2_EMIT_OFFSET
+ # define TC_DWARF2_EMIT_OFFSET(SYMBOL,SIZE) \
+    (generic_dwarf2_emit_offset (SYMBOL, SIZE))
+ #endif
+ 
  #ifndef DWARF2_FORMAT
  # define DWARF2_FORMAT() dwarf2_format_32bit
  #endif
*************** static char const fake_label_name[] = ".
*** 160,165 ****
--- 165,171 ----
  /* The size of an address on the target.  */
  static unsigned int sizeof_address;
  
+ static void generic_dwarf2_emit_offset PARAMS((symbolS *, unsigned int));
  static struct line_subseg *get_line_subseg PARAMS ((segT, subsegT));
  static unsigned int get_filenum PARAMS ((const char *, unsigned int));
  static struct frag *first_frag_for_seg PARAMS ((segT));
*************** static void out_debug_aranges PARAMS ((s
*** 186,191 ****
--- 192,212 ----
  static void out_debug_abbrev PARAMS ((segT));
  static void out_debug_info PARAMS ((segT, segT, segT));
  
+ /* Create an offset to .dwarf2_*.  */
+ 
+ static void
+ generic_dwarf2_emit_offset (symbol, size)
+      symbolS *symbol;
+      unsigned int size;
+ {
+   expressionS expr;
+ 
+   expr.X_op = O_symbol;
+   expr.X_add_symbol = symbol;
+   expr.X_add_number = 0;
+   emit_expr (&expr, size);
+ }
+ 
  /* Find or create an entry for SEG+SUBSEG in ALL_SEGS.  */
  
  static struct line_subseg *
*************** out_debug_aranges (aranges_seg, info_seg
*** 1209,1218 ****
    out_two (2);
  
    /* Offset to .debug_info.  */
!   expr.X_op = O_symbol;
!   expr.X_add_symbol = section_symbol (info_seg);
!   expr.X_add_number = 0;
!   emit_expr (&expr, 4);
  
    /* Size of an address (offset portion).  */
    out_byte (addr_size);
--- 1230,1236 ----
    out_two (2);
  
    /* Offset to .debug_info.  */
!   TC_DWARF2_EMIT_OFFSET (section_symbol (info_seg), 4);
  
    /* Size of an address (offset portion).  */
    out_byte (addr_size);
*************** out_debug_info (info_seg, abbrev_seg, li
*** 1339,1348 ****
    out_two (2);
  
    /* .debug_abbrev offset */
!   expr.X_op = O_symbol;
!   expr.X_add_symbol = section_symbol (abbrev_seg);
!   expr.X_add_number = 0;
!   emit_expr (&expr, sizeof_offset);
  
    /* Target address size.  */
    out_byte (sizeof_address);
--- 1357,1363 ----
    out_two (2);
  
    /* .debug_abbrev offset */
!   TC_DWARF2_EMIT_OFFSET (section_symbol (abbrev_seg), sizeof_offset);
  
    /* Target address size.  */
    out_byte (sizeof_address);
*************** out_debug_info (info_seg, abbrev_seg, li
*** 1351,1360 ****
    out_uleb128 (1);
  
    /* DW_AT_stmt_list */
!   expr.X_op = O_symbol;
!   expr.X_add_symbol = section_symbol (line_seg);
!   expr.X_add_number = 0;
!   emit_expr (&expr, 4);
  
    /* These two attributes may only be emitted if all of the code is
       contiguous.  Multiple sections are not that.  */
--- 1366,1372 ----
    out_uleb128 (1);
  
    /* DW_AT_stmt_list */
!   TC_DWARF2_EMIT_OFFSET (section_symbol (line_seg), 4);
  
    /* These two attributes may only be emitted if all of the code is
       contiguous.  Multiple sections are not that.  */
*** src.orig/gas/config/tc-ia64.h	Thu Mar  6 16:17:21 2003
--- src/gas/config/tc-ia64.h	Thu Mar  6 16:17:11 2003
*************** extern long ia64_pcrel_from_section PARA
*** 89,94 ****
--- 89,95 ----
  extern void ia64_md_do_align PARAMS ((int, const char *, int, int));
  extern void ia64_handle_align PARAMS ((fragS *f));
  extern void ia64_after_parse_args PARAMS ((void));
+ extern void ia64_dwarf2_emit_offset PARAMS ((symbolS *, unsigned int));
  
  #define md_end()       			ia64_end_of_source ()
  #define md_start_line_hook()		ia64_start_line ()
*************** extern void ia64_after_parse_args PARAMS
*** 119,124 ****
--- 120,127 ----
  #define HANDLE_ALIGN(f)			ia64_handle_align (f)
  #define md_elf_section_type(str,len)	ia64_elf_section_type (str, len)
  #define md_after_parse_args()		ia64_after_parse_args ()
+ #define TC_DWARF2_EMIT_OFFSET(symbol,size) \
+ 					ia64_dwarf2_emit_offset (symbol, size)
  
  #define MAX_MEM_FOR_RS_ALIGN_CODE  (15 + 16)
  
*** src.orig/gas/config/tc-ia64.c	Thu Feb 27 12:56:58 2003
--- src/gas/config/tc-ia64.c	Thu Mar  6 16:17:01 2003
*************** ia64_after_parse_args ()
*** 6472,6477 ****
--- 6472,6489 ----
      as_fatal (_("--gstabs is not supported for ia64"));
  }
  
+ void
+ ia64_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
+ {
+   expressionS expr;
+ 
+   expr.X_op = O_pseudo_fixup;
+   expr.X_op_symbol = pseudo_func[FUNC_SEC_RELATIVE].u.sym;
+   expr.X_add_number = 0;
+   expr.X_add_symbol = symbol;
+   emit_expr (&expr, size);
+ }
+ 
  /* Return true if TYPE fits in TEMPL at SLOT.  */
  
  static int
*************** ia64_cons_fix_new (f, where, nbytes, exp
*** 10054,10064 ****
      case 1: code = BFD_RELOC_8; break;
      case 2: code = BFD_RELOC_16; break;
      case 4:
!       if (target_big_endian)
! 	code = BFD_RELOC_IA64_DIR32MSB;
        else
! 	code = BFD_RELOC_IA64_DIR32LSB;
!       break;
  
      case 8:
        /* In 32-bit mode, data8 could mean function descriptors too.  */
--- 10066,10090 ----
      case 1: code = BFD_RELOC_8; break;
      case 2: code = BFD_RELOC_16; break;
      case 4:
!       if (exp->X_op == O_pseudo_fixup
! 	  && exp->X_op_symbol
! 	  && S_GET_VALUE (exp->X_op_symbol) == FUNC_SEC_RELATIVE)
!         {
! 	  if (target_big_endian)
! 	    code = BFD_RELOC_IA64_SECREL32MSB;
! 	  else
! 	    code = BFD_RELOC_IA64_SECREL32LSB;
! 	  exp->X_op = O_symbol;
! 	  break;
! 	}
        else
! 	{
! 	  if (target_big_endian)
! 	    code = BFD_RELOC_IA64_DIR32MSB;
! 	  else
! 	    code = BFD_RELOC_IA64_DIR32LSB;
! 	  break;
! 	}
  
      case 8:
        /* In 32-bit mode, data8 could mean function descriptors too.  */
*************** ia64_cons_fix_new (f, where, nbytes, exp
*** 10082,10087 ****
--- 10108,10124 ----
  	    code = BFD_RELOC_IA64_DTPREL64MSB;
  	  else
  	    code = BFD_RELOC_IA64_DTPREL64LSB;
+ 	  break;
+ 	}
+       else if (exp->X_op == O_pseudo_fixup
+ 	       && exp->X_op_symbol
+ 	       && S_GET_VALUE (exp->X_op_symbol) == FUNC_SEC_RELATIVE)
+ 	{
+ 	  if (target_big_endian)
+ 	    code = BFD_RELOC_IA64_SECREL64MSB;
+ 	  else
+ 	    code = BFD_RELOC_IA64_SECREL64LSB;
+ 	  exp->X_op = O_symbol;
  	  break;
  	}
        else


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]