OSDN Git Service

2011-10-01 François Dumont <fdumont@gcc.gnu.org>
[pf3gnuchains/gcc-fork.git] / lto-plugin / lto-plugin.c
index 64a0164..9323bd2 100644 (file)
@@ -80,12 +80,13 @@ along with this program; see the file COPYING3.  If not see
 
 /* The part of the symbol table the plugin has to keep track of. Note that we
    must keep SYMS until all_symbols_read is called to give the linker time to
-   copy the symbol information. */
+   copy the symbol information. 
+   The id must be 64bit to minimze collisions. */
 
 struct sym_aux
 {
   uint32_t slot;
-  unsigned id;
+  unsigned long long id;
   unsigned next_conflict;
 };
 
@@ -94,7 +95,7 @@ struct plugin_symtab
   int nsyms;
   struct sym_aux *aux;
   struct ld_plugin_symbol *syms;
-  unsigned id;
+  unsigned long long id;
 };
 
 /* Encapsulates object file data during symbol scan.  */
@@ -312,8 +313,7 @@ free_1 (void)
        {
          struct ld_plugin_symbol *s = &symtab->syms[j];
          free (s->name);
-         if (s->comdat_key)
-           free (s->comdat_key);
+         free (s->comdat_key);
        }
       free (symtab->syms);
       symtab->syms = NULL;
@@ -342,8 +342,7 @@ free_2 (void)
   claimed_files = NULL;
   num_claimed_files = 0;
 
-  if (arguments_file_name)
-    free (arguments_file_name);
+  free (arguments_file_name);
   arguments_file_name = NULL;
 }
 
@@ -361,7 +360,8 @@ dump_symtab (FILE *f, struct plugin_symtab *symtab)
       
       assert (resolution != LDPR_UNKNOWN);
 
-      fprintf (f, "%u %x %s %s\n", (unsigned int) slot, symtab->aux[j].id,
+      fprintf (f, "%u %llx %s %s\n",
+               (unsigned int) slot, symtab->aux[j].id,
               lto_resolution_str[resolution], 
               symtab->syms[j].name);
     }
@@ -761,7 +761,7 @@ resolve_conflicts (struct plugin_symtab *t, struct plugin_symtab *conflicts)
            {
              SWAP (struct ld_plugin_symbol, *orig, *s);
              SWAP (uint32_t, orig_aux->slot, aux->slot);
-             SWAP (unsigned, orig_aux->id, aux->id);
+             SWAP (unsigned long long, orig_aux->id, aux->id);
              /* Don't swap conflict chain pointer */
            } 
 
@@ -811,7 +811,7 @@ process_symtab (void *data, const char *name, off_t offset, off_t length)
 
   s = strrchr (name, '.');
   if (s)
-    sscanf (s, ".%x", &obj->out->id);
+    sscanf (s, ".%llx", &obj->out->id);
   secdata = xmalloc (length);
   offset += obj->file->offset;
   if (offset != lseek (obj->file->fd, offset, SEEK_SET)
@@ -851,11 +851,11 @@ claim_file_handler (const struct ld_plugin_input_file *file, int *claimed)
       /* We pass the offset of the actual file, not the archive header.
          Can't use PRIx64, because that's C99, so we have to print the
         64-bit hex int as two 32-bit ones. */
-      int lo, hi;
+      int lo, hi, t;
       lo = file->offset & 0xffffffff;
       hi = ((int64_t)file->offset >> 32) & 0xffffffff;
-      int t = hi ? asprintf (&objname, "%s@0x%x%08x", file->name, lo, hi)
-               : asprintf (&objname, "%s@0x%x", file->name, lo);
+      t = hi ? asprintf (&objname, "%s@0x%x%08x", file->name, lo, hi)
+            : asprintf (&objname, "%s@0x%x", file->name, lo);
       check (t >= 0, LDPL_FATAL, "asprintf failed");
       lto_file.name = objname;
     }