Patchwork different impl. Re: [Patch darwin, debug] make debug section starts explicit.

login
register
mail settings
Submitter IainS
Date Oct. 31, 2010, 2:59 p.m.
Message ID <3666E272-5A54-40B0-A8EF-BFC2A1342F75@sandoe-acoustics.co.uk>
Download mbox | patch
Permalink /patch/69716/
State New
Headers show

Comments

IainS - Oct. 31, 2010, 2:59 p.m.
On 30 Oct 2010, at 19:03, Richard Henderson wrote:

> On 10/30/2010 01:07 AM, IainS wrote:
>> Ah well, something to consider for 4.7 ;-) ...
>
> This *is* a bug fix, isn't it?  If so, you don't have to
> wait for stage1 to open up again.  You've got 2 months...

I had missed the obvious ...  that we gained a   
"darwin_asm_named_section" along with lto...

... this is not as neat as Richard's suggestion...
... but it is entirely local to darwin (and roughly the same amount of  
work
"is it dwarf debug? yes..  did we emit this section yet? if no ...  
then put a label" )

if Mike is OK with this... , it does the job.

OK for trunk?
Iain

gcc:

	* config/darwin.c (darwin_asm_named_section): Check for __DWARF  
sections.
	(darwin_asm_dwarf_section): New.
	(darwin_file_start): Remove code emitting dwarf section symbols.
Richard Henderson - Oct. 31, 2010, 9:05 p.m.
Please remind me what the goal is here?  A label at the beginning of
the section?  E.g. the existing debug_info_section_label?


r~
IainS - Oct. 31, 2010, 9:16 p.m.
On 31 Oct 2010, at 21:05, Richard Henderson wrote:

> Please remind me what the goal is here?  A label at the beginning of
> the section?  E.g. the existing debug_info_section_label?

The goal is to make the section order for code & data the same with/ 
without debug. (i.e. debug sections to appear after)

Darwin requires a start label for each debug section because the  
offsets used for debug entities are section-local rather than relocs.
(without the patch that is being achieved by spitting out a section  
start for each debug section at the start of any asm file with debug  
enabled).

---

I'm just waiting for a reg-test to finish and then I have a second  
patch which moves the  macinfo & other two section starts from  
dwarf2_init => dwarf2_finish ()

cheers,
Iain
Mike Stump - Nov. 1, 2010, 5:48 p.m.
On Oct 31, 2010, at 7:59 AM, IainS wrote:
> OK for trunk?

Ok.

> gcc:
> 
> 	* config/darwin.c (darwin_asm_named_section): Check for __DWARF sections.
> 	(darwin_asm_dwarf_section): New.
> 	(darwin_file_start): Remove code emitting dwarf section symbols.
IainS - Nov. 2, 2010, 11:16 a.m.
On 1 Nov 2010, at 17:48, Mike Stump wrote:

> On Oct 31, 2010, at 7:59 AM, IainS wrote:
>> OK for trunk?
>
> Ok.
r166174 (including the test-case amendment from the original post).
thanks
Iain

Patch

Index: gcc/config/darwin.c
===================================================================
--- gcc/config/darwin.c	(revision 166092)
+++ gcc/config/darwin.c	(working copy)
@@ -1459,6 +1459,11 @@  darwin_asm_lto_end (void)
   saved_asm_out_file = NULL;
 }
 
+static void
+darwin_asm_dwarf_section (const char *name, unsigned int flags, tree decl);
+
+/*  Called for the TARGET_ASM_NAMED_SECTION hook.  */
+
 void
 darwin_asm_named_section (const char *name,
 			  unsigned int flags,
@@ -1495,6 +1500,8 @@  darwin_asm_named_section (const char *name,
       gcc_assert (lto_section_names_offset > 0
 		  && lto_section_names_offset < ((unsigned) 1 << 31));
     }
+  else if (strncmp (name, "__DWARF,", 8) == 0)
+    darwin_asm_dwarf_section (name, flags, decl);
   else
     fprintf (asm_out_file, "\t.section %s\n", name);
 }
@@ -1675,6 +1682,73 @@  darwin_assemble_visibility (tree decl, int vis)
 	     "not supported in this configuration; ignored");
 }
 
+/* VEC Used by darwin_asm_dwarf_section.
+   Maybe a hash tab would be better here - but the intention is that this is
+   a very short list (fewer than 16 items) and each entry should (ideally, 
+   eventually) only be presented once.
+
+   A structure to hold a dwarf debug section used entry.  */
+
+typedef struct GTY(()) dwarf_sect_used_entry {
+  const char *name;
+  unsigned count;
+}
+dwarf_sect_used_entry;
+
+DEF_VEC_O(dwarf_sect_used_entry);
+DEF_VEC_ALLOC_O(dwarf_sect_used_entry, gc);
+
+/* A list of used __DWARF sections.  */
+static GTY (()) VEC (dwarf_sect_used_entry, gc) * dwarf_sect_names_table;
+
+/* This is called when we are asked to assemble a named section and the 
+   name begins with __DWARF,.  We keep a list of the section names (without
+   the __DWARF, prefix) and use this to emit our required start label on the
+   first switch to each section.  */
+
+static void
+darwin_asm_dwarf_section (const char *name, unsigned int flags,
+			  tree ARG_UNUSED (decl))
+{
+  unsigned i;
+  int namelen;
+  const char * sname;
+  dwarf_sect_used_entry *ref;
+  bool found = false;
+  gcc_assert ((flags & (SECTION_DEBUG | SECTION_NAMED))
+		    == (SECTION_DEBUG | SECTION_NAMED));
+  /* We know that the name starts with __DWARF,  */
+  sname = name + 8;
+  namelen = strchr (sname, ',') - sname;
+  gcc_assert (namelen);
+  if (dwarf_sect_names_table == NULL)
+    dwarf_sect_names_table = VEC_alloc (dwarf_sect_used_entry, gc, 16);
+  else
+    for (i = 0; 
+	 VEC_iterate (dwarf_sect_used_entry, dwarf_sect_names_table, i, ref);
+	 i++)
+      {
+	if (!ref)
+	  break;
+	if (!strcmp (ref->name, sname))
+	  {
+	    found = true;
+	    ref->count++;
+	    break;
+	  }
+      }
+
+  fprintf (asm_out_file, "\t.section %s\n", name);
+  if (!found)
+    {
+      dwarf_sect_used_entry e;
+      fprintf (asm_out_file, "Lsection%.*s:\n", namelen, sname);
+      e.count = 1;
+      e.name = xstrdup (sname);
+      VEC_safe_push (dwarf_sect_used_entry, gc, dwarf_sect_names_table, &e);
+    }
+}
+
 /* Output a difference of two labels that will be an assembly time
    constant if the two labels are local.  (.long lab1-lab2 will be
    very different if lab1 is at the boundary between two sections; it
@@ -1703,49 +1777,6 @@  darwin_asm_output_dwarf_delta (FILE *file, int siz
     fprintf (file, "\n\t%s L$set$%d", directive, darwin_dwarf_label_counter++);
 }
 
-/* Output labels for the start of the DWARF sections if necessary.
-   Initialize the stuff we need for LTO long section names support.  */
-void
-darwin_file_start (void)
-{
-  if (write_symbols == DWARF2_DEBUG)
-    {
-      static const char * const debugnames[] =
-	{
-	  DEBUG_FRAME_SECTION,
-	  DEBUG_INFO_SECTION,
-	  DEBUG_ABBREV_SECTION,
-	  DEBUG_ARANGES_SECTION,
-	  DEBUG_MACINFO_SECTION,
-	  DEBUG_LINE_SECTION,
-	  DEBUG_LOC_SECTION,
-	  DEBUG_PUBNAMES_SECTION,
-	  DEBUG_PUBTYPES_SECTION,
-	  DEBUG_STR_SECTION,
-	  DEBUG_RANGES_SECTION
-	};
-      size_t i;
-
-      for (i = 0; i < ARRAY_SIZE (debugnames); i++)
-	{
-	  int namelen;
-
-	  switch_to_section (get_section (debugnames[i], SECTION_DEBUG, NULL));
-
-	  gcc_assert (strncmp (debugnames[i], "__DWARF,", 8) == 0);
-	  gcc_assert (strchr (debugnames[i] + 8, ','));
-
-	  namelen = strchr (debugnames[i] + 8, ',') - (debugnames[i] + 8);
-	  fprintf (asm_out_file, "Lsection%.*s:\n", namelen, debugnames[i] + 8);
-	}
-    }
-
-  /* We fill this obstack with the complete section text for the lto section
-     names to write in darwin_file_end.  */
-  obstack_init (&lto_section_names_obstack);
-  lto_section_names_offset = 0;
-}
-
 /* Output an offset in a DWARF section on Darwin.  On Darwin, DWARF section
    offsets are not represented using relocs in .o files; either the
    section never leaves the .o file, or the linker or other tool is
@@ -1767,7 +1798,24 @@  darwin_asm_output_dwarf_offset (FILE *file, int si
   darwin_asm_output_dwarf_delta (file, size, lab, sname);
 }
 
+/* Called from the within the TARGET_ASM_FILE_START for each target. 
+  Initialize the stuff we need for LTO long section names support.  */
+
 void
+darwin_file_start (void)
+{
+  /* We fill this obstack with the complete section text for the lto section
+     names to write in darwin_file_end.  */
+  obstack_init (&lto_section_names_obstack);
+  lto_section_names_offset = 0;
+}
+
+/* Called for the TARGET_ASM_FILE_END hook.
+   Emit the mach-o pic indirection data, the lto data and, finally a flag
+   to tell the linker that it can break the file object into sections and
+   move those around for efficiency.  */
+
+void
 darwin_file_end (void)
 {
   const char *lto_section_names;