re PR bootstrap/42096 (lto.c:289:7: error: implicit declaration of function 'strtoll')
authorRafael Avila de Espindola <espindola@google.com>
Thu, 19 Nov 2009 15:30:04 +0000 (15:30 +0000)
committerRafael Espindola <espindola@gcc.gnu.org>
Thu, 19 Nov 2009 15:30:04 +0000 (15:30 +0000)
2009-11-19  Rafael Avila de Espindola  <espindola@google.com>

PR bootstrap/42096
* lto-plugin.c (claim_file_handler): Print offsets in hex.

2009-11-19  Rafael Avila de Espindola  <espindola@google.com>

PR bootstrap/42096
* lto-elf.c (lto_elf_file_open): Use lto_parse_hex.
* lto.c (lto_parse_hex): New.
(lto_resolution_read): Use lto_parse_hex.
* lto.h (lto_parse_hex): New.

From-SVN: r154330

gcc/lto/ChangeLog
gcc/lto/lto-elf.c
gcc/lto/lto.c
gcc/lto/lto.h
lto-plugin/ChangeLog
lto-plugin/lto-plugin.c

index 54dabf2cc8a5758fa906aed903370be91e5d9932..6792d183a51f29a426e6863543f1c8d0dac8b54f 100644 (file)
@@ -1,3 +1,11 @@
+2009-11-19  Rafael Avila de Espindola  <espindola@google.com>
+
+       PR bootstrap/42096
+       * lto-elf.c (lto_elf_file_open): Use lto_parse_hex.
+       * lto.c (lto_parse_hex): New.
+       (lto_resolution_read): Use lto_parse_hex.
+       * lto.h (lto_parse_hex): New.
+
 2009-11-17  Rafael Avila de Espindola  <espindola@google.com>
 
        * lto-elf.c (lto_file_init): Add offset argument.
index 368d8d4d75fc7ddb5af0d6fc259d688fb3f54a17..7c5453a41bf143b215e2908bde814c97c1aa41be 100644 (file)
@@ -559,14 +559,8 @@ lto_elf_file_open (const char *filename, bool writable)
       fname = (char *) xmalloc (offset_p - filename + 1);
       memcpy (fname, filename, offset_p - filename);
       fname[offset_p - filename] = '\0';
-      offset_p++;
-      errno = 0;
-      offset = strtoll (offset_p, NULL, 10);
-      if (errno != 0)
-        {
-          error ("could not parse offset %s", offset_p);
-          goto fail;
-        }
+      offset_p += 3; /* skip the @0x */
+      offset = lto_parse_hex (offset_p);
       /* elf_rand expects the offset to point to the ar header, not the
          object itself. Subtract the size of the ar header (60 bytes).
          We don't uses sizeof (struct ar_hd) to avoid including ar.h */
index 9cb7d65a60bc8eccb8ab3d392a10c8ebd5eee114..4d7c3079b49357520147095a1d364c1214edb731 100644 (file)
@@ -249,6 +249,28 @@ lto_read_decls (struct lto_file_decl_data *decl_data, const void *data,
   lto_data_in_delete (data_in);
 }
 
+/* strtoll is not portable. */
+int64_t
+lto_parse_hex (const char *p) {
+  uint64_t ret = 0;
+  for (; *p != '\0'; ++p)
+    {
+      char c = *p;
+      unsigned char part;
+      ret <<= 4;
+      if (c >= '0' && c <= '9')
+        part = c - '0';
+      else if (c >= 'a' && c <= 'f')
+        part = c - 'a' + 10;
+      else if (c >= 'A' && c <= 'F')
+        part = c - 'A' + 10;
+      else
+        internal_error ("could not parse hex number");
+      ret |= part;
+    }
+  return ret;
+}
+
 /* Read resolution for file named FILE_NAME. The resolution is read from
    RESOLUTION. An array with the symbol resolution is returned. The array
    size is written to SIZE. */
@@ -280,15 +302,12 @@ lto_resolution_read (FILE *resolution, lto_file *file)
   if (file->offset != 0)
     {
       int t;
-      char offset_p[21];
-      long long offset;
-      t = fscanf (resolution, "@%20s", offset_p);
+      char offset_p[17];
+      int64_t offset;
+      t = fscanf (resolution, "@0x%16s", offset_p);
       if (t != 1)
         internal_error ("could not parse file offset");
-      errno = 0;
-      offset = strtoll(offset_p, NULL, 10);
-      if (errno != 0)
-        internal_error ("could not parse file offset");
+      offset = lto_parse_hex (offset_p);
       if (offset != file->offset)
         internal_error ("unexpected offset");
     }
index 3b92b41e9a38f618d93aa9a10d950922d0e7b61b..0c4305a1731c637fbd59146b4c7a7f6f03ed5fa0 100644 (file)
@@ -57,5 +57,6 @@ struct lto_section_slot
   size_t len;
 };
 
+int64_t lto_parse_hex (const char *p);
 
 #endif /* LTO_H */
index d95cf05d9d00abca3b3a3cb0476f45db33547558..d6e939419af96121b12c6ac3639f1a5bfac2387d 100644 (file)
@@ -1,3 +1,8 @@
+2009-11-19  Rafael Avila de Espindola  <espindola@google.com>
+
+       PR bootstrap/42096
+       * lto-plugin.c (claim_file_handler): Print offsets in hex.
+
 2009-11-12  Rafael Avila de Espindola  <espindola@google.com>
 
        * lto-plugin.c (write_resolution): Assume resolution_file is set.
index 8cbafbc46cd364c50c27d672d8efa3f6c85d6021..4a8a0ff5b7d975c9ddc3db2e8cb9c0f6dd63c657 100644 (file)
@@ -551,7 +551,7 @@ claim_file_handler (const struct ld_plugin_input_file *file, int *claimed)
       Elf *archive;
       off_t offset;
       /* We pass the offset of the actual file, not the archive header. */
-      int t = asprintf (&objname, "%s@%" PRId64, file->name,
+      int t = asprintf (&objname, "%s@0x%" PRIx64, file->name,
                         (int64_t) file->offset);
       check (t >= 0, LDPL_FATAL, "asprintf failed");
       lto_file.name = objname;