Rearrange symbol_create parameters
[deliverable/binutils-gdb.git] / gas / dwarf2dbg.c
index 69955fea5bfb5cf0f21b0460cc8f0e154722eb3d..e4ba56d82ba523ec026bb735cbd18fe0c12a37d0 100644 (file)
@@ -546,10 +546,10 @@ dwarf2_gen_line_info (addressT ofs, struct dwarf2_line_info *loc)
       /* Use a non-fake name for the line number location,
         so that it can be referred to by relocations.  */
       sprintf (name, ".Loc.%u.%u", line, filenum);
-      sym = symbol_new (name, now_seg, ofs, frag_now);
+      sym = symbol_new (name, now_seg, frag_now, ofs);
     }
   else
-    sym = symbol_temp_new (now_seg, ofs, frag_now);
+    sym = symbol_temp_new (now_seg, frag_now, ofs);
   dwarf2_gen_line_info_1 (sym, loc);
 }
 
@@ -1245,8 +1245,8 @@ dwarf2_directive_loc (int dummy ATTRIBUTE_UNUSED)
                sym = force_reset_view;
              else
                {
-                 sym = symbol_temp_new (absolute_section, value,
-                                        &zero_address_frag);
+                 sym = symbol_temp_new (absolute_section, &zero_address_frag,
+                                        value);
                  if (force_reset)
                    force_reset_view = sym;
                }
@@ -1962,7 +1962,7 @@ process_entries (segT seg, struct line_entry *e)
     out_inc_line_addr (INT_MAX, frag_ofs - last_frag_ofs);
   else
     {
-      lab = symbol_temp_new (seg, frag_ofs, frag);
+      lab = symbol_temp_new (seg, frag, frag_ofs);
       relax_inc_line_addr (INT_MAX, lab, last_lab);
     }
 }
@@ -1992,18 +1992,29 @@ out_dir_and_file_list (void)
         the .debug_line_str section and reference them here.  */
       out_uleb128 (DW_FORM_string);
 
-      /* Now state how many rows there are in the table.  */
-      out_uleb128 (dirs_in_use);
+      /* Now state how many rows there are in the table.  We need at
+        least 1 if there is one or more file names to store the
+        "working directory".  */
+      if (dirs_in_use == 0 && files_in_use > 0)
+       out_uleb128 (1);
+      else
+       out_uleb128 (dirs_in_use);
     }
       
   /* Emit directory list.  */
-  if (DWARF2_LINE_VERSION >= 5 && dirs_in_use > 0)
+  if (DWARF2_LINE_VERSION >= 5 && (dirs_in_use > 0 || files_in_use > 0))
     {
-      if (dirs == NULL || dirs[0] == NULL)
-       dir = remap_debug_filename (".");
-      else
+      /* DWARF5 uses slot zero, but that is only set explicitly
+        using a .file 0 directive.  If that isn't used, but dir
+        one is used, then use that as main file directory.
+        Otherwise use pwd as main file directory.  */
+      if (dirs_in_use > 0 && dirs != NULL && dirs[0] != NULL)
        dir = remap_debug_filename (dirs[0]);
-       
+      else if (dirs_in_use > 1 && dirs != NULL && dirs[1] != NULL)
+       dir = remap_debug_filename (dirs[1]);
+      else
+       dir = remap_debug_filename (getpwd ());
+
       size = strlen (dir) + 1;
       cp = frag_more (size);
       memcpy (cp, dir, size);
@@ -2089,8 +2100,14 @@ out_dir_and_file_list (void)
 
       if (files[i].filename == NULL)
        {
-         /* Prevent a crash later, particularly for file 1.  */
-         files[i].filename = "";
+         /* Prevent a crash later, particularly for file 1.  DWARF5
+            uses slot zero, but that is only set explicitly using a
+            .file 0 directive.  If that isn't used, but file 1 is,
+            then use that as main file name.  */
+         if (DWARF2_LINE_VERSION >= 5 && i == 0 && files_in_use >= 1)
+             files[0].filename = files[1].filename;
+         else
+           files[i].filename = "";
          if (DWARF2_LINE_VERSION < 5 || i != 0)
            {
              as_bad (_("unassigned file number %ld"), (long) i);
@@ -2309,11 +2326,11 @@ out_debug_ranges (segT ranges_seg)
       symbolS *beg, *end;
 
       frag = first_frag_for_seg (s->seg);
-      beg = symbol_temp_new (s->seg, 0, frag);
+      beg = symbol_temp_new (s->seg, frag, 0);
       s->text_start = beg;
 
       frag = last_frag_for_seg (s->seg);
-      end = symbol_temp_new (s->seg, get_frag_fix (frag, s->seg), frag);
+      end = symbol_temp_new (s->seg, frag, get_frag_fix (frag, s->seg));
       s->text_end = end;
 
       exp.X_op = O_symbol;
@@ -2378,11 +2395,11 @@ out_debug_aranges (segT aranges_seg, segT info_seg)
       symbolS *beg, *end;
 
       frag = first_frag_for_seg (s->seg);
-      beg = symbol_temp_new (s->seg, 0, frag);
+      beg = symbol_temp_new (s->seg, frag, 0);
       s->text_start = beg;
 
       frag = last_frag_for_seg (s->seg);
-      end = symbol_temp_new (s->seg, get_frag_fix (frag, s->seg), frag);
+      end = symbol_temp_new (s->seg, frag, get_frag_fix (frag, s->seg));
       s->text_end = end;
 
       exp.X_op = O_symbol;
@@ -2427,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
     {
@@ -2464,12 +2480,26 @@ out_debug_info (segT info_seg, segT abbrev_seg, segT line_seg, segT ranges_seg,
   /* DWARF version.  */
   out_two (DWARF2_VERSION);
 
-  /* .debug_abbrev offset */
-  TC_DWARF2_EMIT_OFFSET (section_symbol (abbrev_seg), sizeof_offset);
+  if (DWARF2_VERSION < 5)
+    {
+      /* .debug_abbrev offset */
+      TC_DWARF2_EMIT_OFFSET (section_symbol (abbrev_seg), sizeof_offset);
+    }
+  else
+    {
+      /* unit (header) type */
+      out_byte (DW_UT_compile);
+    }
 
   /* Target address size.  */
   out_byte (sizeof_address);
 
+  if (DWARF2_VERSION >= 5)
+    {
+      /* .debug_abbrev offset */
+      TC_DWARF2_EMIT_OFFSET (section_symbol (abbrev_seg), sizeof_offset);
+    }
+
   /* DW_TAG_compile_unit DIE abbrev */
   out_uleb128 (1);
 
@@ -2497,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
     {
This page took 0.024769 seconds and 4 git commands to generate.