This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug target/82005] [8 regression] early lto debug creates invalid assembly on Darwin
- From: "rguenth at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Wed, 30 Aug 2017 11:58:06 +0000
- Subject: [Bug target/82005] [8 regression] early lto debug creates invalid assembly on Darwin
- Auto-submitted: auto-generated
- References: <bug-82005-4@http.gcc.gnu.org/bugzilla/>
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82005
--- Comment #6 from Richard Biener <rguenth at gcc dot gnu.org> ---
To recap the situation we have sth like
earlyDebug.o
section .debug_info:
sym1:
CU1
...
CU2 at coff1
lateDebug.o
section .debug_info:
...
DW_TAG_imported_unit
DW_AT_import $sym1 - .debug_info + coff1
I suppose we could somehow rely on .debug_info being relocated to 0. Changing
the assembler that way works (but we're missing the provider of the early debug
so I can't double-check the final dwarf).
I suppose we'd need a new dw2_asm_output primitive for this (offset
within zero-relocated section, sym + offset) plus the associated target
macro. Or put that knowledge (section is relocated to zero) into
darwin_asm_output_dwarf_offset somehow. Like with
Index: config/darwin.c
===================================================================
--- config/darwin.c (revision 251449)
+++ config/darwin.c (working copy)
@@ -2859,7 +2859,8 @@ darwin_asm_output_dwarf_delta (FILE *fil
const char *lab1, const char *lab2,
HOST_WIDE_INT offset)
{
- int islocaldiff = (lab1[0] == '*' && lab1[1] == 'L'
+ int islocaldiff = (lab2
+ && lab1[0] == '*' && lab1[1] == 'L'
&& lab2[0] == '*' && lab2[1] == 'L');
const char *directive = (size == 8 ? ".quad" : ".long");
@@ -2869,8 +2870,11 @@ darwin_asm_output_dwarf_delta (FILE *fil
fprintf (file, "\t%s\t", directive);
assemble_name_raw (file, lab1);
- fprintf (file, "-");
- assemble_name_raw (file, lab2);
+ if (lab2)
+ {
+ fprintf (file, "-");
+ assemble_name_raw (file, lab2);
+ }
if (offset != 0)
fprintf (file, "+" HOST_WIDE_INT_PRINT_DEC, offset);
if (islocaldiff)
@@ -2905,7 +2909,9 @@ darwin_asm_output_dwarf_offset (FILE *fi
extra = 4;
}
snprintf (sname, 64, "*Lsection%.*s%.*s", namelen, name, extra, lto_add);
- darwin_asm_output_dwarf_delta (file, size, lab, sname, offset);
+ darwin_asm_output_dwarf_delta (file, size, lab,
+ strncmp (name, "__debug_info", namelen)
+ ? sname : NULL, offset);
}
/* Called from the within the TARGET_ASM_FILE_START for each target. */
that seems to work with and without -flto up to the extent that UNDEFs
(the early debug is not extracted and thus not linked) seem to be
resolved to zero by the link editor.