From 8189766950a1fe0ce81d80fd63a73fce5d85d68c Mon Sep 17 00:00:00 2001 From: espindola Date: Thu, 19 Nov 2009 15:30:04 +0000 Subject: [PATCH] 2009-11-19 Rafael Avila de Espindola PR bootstrap/42096 * lto-plugin.c (claim_file_handler): Print offsets in hex. 2009-11-19 Rafael Avila de Espindola 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@154330 138bc75d-0d04-0410-961f-82ee72b054a4 --- 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 54dabf2..6792d18 100644 --- a/gcc/lto/ChangeLog +++ b/gcc/lto/ChangeLog @@ -1,3 +1,11 @@ +2009-11-19 Rafael Avila de Espindola + + 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 * lto-elf.c (lto_file_init): Add offset argument. diff --git a/gcc/lto/lto-elf.c b/gcc/lto/lto-elf.c index 368d8d4..7c5453a 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 9cb7d65..4d7c307 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 3b92b41..0c4305a 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 d95cf05..d6e9394 100644 --- a/lto-plugin/ChangeLog +++ b/lto-plugin/ChangeLog @@ -1,3 +1,8 @@ +2009-11-19 Rafael Avila de Espindola + + PR bootstrap/42096 + * lto-plugin.c (claim_file_handler): Print offsets in hex. + 2009-11-12 Rafael Avila de Espindola * 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 8cbafbc..4a8a0ff 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; -- 2.7.4