gas: Use udata for DW_AT_high_pc when emitting DWARF4
authorMark Wielaard <mark@klomp.org>
Mon, 3 Aug 2020 20:02:24 +0000 (22:02 +0200)
committerMark Wielaard <mark@klomp.org>
Tue, 4 Aug 2020 09:42:53 +0000 (11:42 +0200)
For DWARF4 DW_AT_high_pc can be expressed as constant offset from
DW_AT_low_pc which saves a relocation. Use DW_FORM_udate (uleb128)
to keep the constant value as small as possible.

gas/ChangeLog:

       * dwarf2dbg.c (out_debug_abbrev): When DWARF2_VERSION >= 4, use
       DW_FORM_udata for DW_AT_high_pc.
       (out_debug_info): Use emit_leb128_expr for DW_AT_high_pc, when
       DWARF2_VERSION >= 4.
       * read.c (emit_leb128_exp): No longer static.
       * read.h (emit_leb128_exp): Define.

gas/ChangeLog
gas/dwarf2dbg.c
gas/read.c
gas/read.h

index 8895c0c0c7fbc22f13e516427631ebb2b25751c8..28a6b1b2b93d693ec58c0a44395e6e80e172b736 100644 (file)
@@ -1,3 +1,12 @@
+2020-08-04  Mark Wielaard  <mark@klomp.org>
+
+       * dwarf2dbg.c (out_debug_abbrev): When DWARF2_VERSION >= 4, use
+       DW_FORM_udata for DW_AT_high_pc.
+       (out_debug_info): Use emit_leb128_expr for DW_AT_high_pc, when
+       DWARF2_VERSION >= 4.
+       * read.c (emit_leb128_exp): No longer static.
+       * read.h (emit_leb128_exp): Define.
+
 2020-08-02  Mark Wielaard  <mark@klomp.org>
 
        * gas/dwarf2dbg.c (out_dir_and_file_list): For DWARF5 emit at
index 7877c563887246dcc0a7329ff5b8e27d66a927ca..a95c29736f0b6d33a03255788415023fb4d6636a 100644 (file)
@@ -2444,8 +2444,7 @@ out_debug_abbrev (segT abbrev_seg,
       if (DWARF2_VERSION < 4)
        out_abbrev (DW_AT_high_pc, DW_FORM_addr);
       else
-       out_abbrev (DW_AT_high_pc, (sizeof_address == 4
-                                   ? DW_FORM_data4 : DW_FORM_data8));
+       out_abbrev (DW_AT_high_pc, DW_FORM_udata);
     }
   else
     {
@@ -2528,7 +2527,10 @@ out_debug_info (segT info_seg, segT abbrev_seg, segT line_seg, segT ranges_seg,
        }
       exp.X_add_symbol = all_segs->text_end;
       exp.X_add_number = 0;
-      emit_expr (&exp, sizeof_address);
+      if (DWARF2_VERSION < 4)
+       emit_expr (&exp, sizeof_address);
+      else
+       emit_leb128_expr (&exp, 0);
     }
   else
     {
index 8f93c2ba2b461a22440889e67875fb40a34275f4..f192cc16d579d05443051fc33fe759bb08d4cc09 100644 (file)
@@ -5138,7 +5138,7 @@ output_big_leb128 (char *p, LITTLENUM_TYPE *bignum, unsigned int size, int sign)
 /* Generate the appropriate fragments for a given expression to emit a
    leb128 value.  SIGN is 1 for sleb, 0 for uleb.  */
 
-static void
+void
 emit_leb128_expr (expressionS *exp, int sign)
 {
   operatorT op = exp->X_op;
index 502f3b6f2da8daa9e6188f4c13945c9c9e6bd52a..ffcdbb69a7b96518c03f0ba6cd420bb72ef9040e 100644 (file)
@@ -132,6 +132,7 @@ extern void emit_expr_with_reloc (expressionS *exp, unsigned int nbytes,
                                  TC_PARSE_CONS_RETURN_TYPE);
 extern void emit_expr_fix (expressionS *, unsigned int, fragS *, char *,
                           TC_PARSE_CONS_RETURN_TYPE);
+extern void emit_leb128_expr (expressionS *, int);
 extern void equals (char *, int);
 extern void float_cons (int);
 extern void ignore_rest_of_line (void);