From 92fa7608a4401aa21b378c3cb786098e32677825 Mon Sep 17 00:00:00 2001
From: Rafael Avila de Espindola <espindola@google.com>
Date: Thu, 19 Nov 2009 15:30:04 +0000
Subject: [PATCH] re PR bootstrap/42096 (lto.c:289:7: error: implicit
 declaration of function 'strtoll')

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       |  8 ++++++++
 gcc/lto/lto-elf.c       | 10 ++--------
 gcc/lto/lto.c           | 33 ++++++++++++++++++++++++++-------
 gcc/lto/lto.h           |  1 +
 lto-plugin/ChangeLog    |  5 +++++
 lto-plugin/lto-plugin.c |  2 +-
 6 files changed, 43 insertions(+), 16 deletions(-)

diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog
index 54dabf2cc8a5..6792d183a51f 100644
--- a/gcc/lto/ChangeLog
+++ b/gcc/lto/ChangeLog
@@ -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.
diff --git a/gcc/lto/lto-elf.c b/gcc/lto/lto-elf.c
index 368d8d4d75fc..7c5453a41bf1 100644
--- a/gcc/lto/lto-elf.c
+++ b/gcc/lto/lto-elf.c
@@ -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 */
diff --git a/gcc/lto/lto.c b/gcc/lto/lto.c
index 9cb7d65a60bc..4d7c3079b493 100644
--- a/gcc/lto/lto.c
+++ b/gcc/lto/lto.c
@@ -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");
     }
diff --git a/gcc/lto/lto.h b/gcc/lto/lto.h
index 3b92b41e9a38..0c4305a1731c 100644
--- a/gcc/lto/lto.h
+++ b/gcc/lto/lto.h
@@ -57,5 +57,6 @@ struct lto_section_slot
   size_t len;
 };
 
+int64_t lto_parse_hex (const char *p);
 
 #endif /* LTO_H */
diff --git a/lto-plugin/ChangeLog b/lto-plugin/ChangeLog
index d95cf05d9d00..d6e939419af9 100644
--- a/lto-plugin/ChangeLog
+++ b/lto-plugin/ChangeLog
@@ -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.
diff --git a/lto-plugin/lto-plugin.c b/lto-plugin/lto-plugin.c
index 8cbafbc46cd3..4a8a0ff5b7d9 100644
--- a/lto-plugin/lto-plugin.c
+++ b/lto-plugin/lto-plugin.c
@@ -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;
-- 
GitLab