This happens on x86-linux in gas 2.14 and 2.16, and the bug
is still in the source code in the latest CVS version.

.file directives do not work unless they are emitted in numerical
order. For example, this fails:

        .file   2       "/something_else"
        .loc    2 402 1
        .file   1       "/something"
        .loc    2 402 1

$ as bar.s
bar.s: Assembler messages:
bar.s:4: Error: unassigned file number 2


It looks like a 'get_filenum' bug. 'get_filenum' tries to correctly
handle file numbers being declared out of order, e.g. it understands
there may be "holes" in the numbering space containing NULL
filenames. But it always sets files_in_use to one beyond the latest
number it has seen, effectively forgetting about any higher-numbered
file that was already declared.

Fortunately, the patch is trivial.


--- dwarf2dbg.c.orig    2006-01-11 11:16:47.000000000 -0500
+++ dwarf2dbg.c 2006-02-22 13:38:53.000000000 -0500
@@ -415,19 +415,20 @@
       files_allocated = i + 32;
       files = (struct file_entry *)
        xrealloc (files, (i + 32) * sizeof (struct file_entry));
 
       memset (files + old, 0, (i + 32 - old) * sizeof (struct file_entry));
     }
 
   files[i].filename = num ? file : xstrdup (file);
   files[i].dir = dir;
-  files_in_use = i + 1;
+  if (i + 1 > files_in_use)
+    files_in_use = i + 1;
   last_used = i;
   last_used_dir_len = dir_len;
 
   return i;
 }
 
 /* Handle two forms of .file directive:
    - Pass .file "source.c" to s_app_file
    - Handle .file 1 "source.c" by adding an entry to the DWARF-2 file table


Of course, if the assembler really wants to require .files to appear
in order, it should report an error rather than silently dropping
entries. But I think it's supposed to work.

-Mat



_______________________________________________
bug-binutils mailing list
bug-binutils@gnu.org
http://lists.gnu.org/mailman/listinfo/bug-binutils

Reply via email to