This is the mail archive of the mailing list for the GCC 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]

[patch] Fix glitch with DW_AT_MIPS_linkage_name


if a symbol is prefixed with '*', it will be assembled verbatim:

/* Output to FILE (an assembly file) a reference to NAME.  If NAME
   starts with a *, the rest of NAME is output verbatim.  Otherwise
   NAME is transformed in a target-specific way (usually by the
   addition of an underscore).  */

assemble_name_raw (FILE *file, const char *name)
  if (name[0] == '*')
    fputs (&name[1], file);
    ASM_OUTPUT_LABELREF (file, name);

We use this in Ada for the Link_Name of pragma Export.  The problem is that 
the '*' is then emitted in the debug info:

        .long   .LASF9  # DW_AT_name: "pck__one_global_buffer"
        .byte   0x3     # DW_AT_decl_file (
        .byte   0xa     # DW_AT_decl_line
        .long   .LASF10 # DW_AT_MIPS_linkage_name: "*ONE_GLOBAL_BUFFER"

which confuses GDB.

Tested on i586-suse-linux, OK for mainline?

2010-06-06  Eric Botcazou  <>

	* dwarf2out.c (add_name_and_src_coords_attributes): Skip a leading '*'
	in the DW_AT_MIPS_linkage_name.

Eric Botcazou
Index: dwarf2out.c
--- dwarf2out.c	(revision 160335)
+++ dwarf2out.c	(working copy)
@@ -17211,8 +17211,14 @@ add_name_and_src_coords_attributes (dw_d
 	      deferred_asm_name = asm_name;
 	  else if (DECL_ASSEMBLER_NAME (decl) != DECL_NAME (decl))
-	    add_AT_string (die, AT_linkage_name,
+	    {
+	      const char *name
+	      /* Mimic what assemble_name_raw does with a leading '*'.  */
+	      if (name[0] == '*')
+		name = &name[1];
+	      add_AT_string (die, DW_AT_MIPS_linkage_name, name);
+	    }

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