diff options
author | Rafael Avila de Espindola <espindola@google.com> | 2009-11-19 15:30:04 +0000 |
---|---|---|
committer | Rafael Espindola <espindola@gcc.gnu.org> | 2009-11-19 15:30:04 +0000 |
commit | 92fa7608a4401aa21b378c3cb786098e32677825 (patch) | |
tree | 2bceb2caf367c96e78ef2f30f853dfb57daaa53c | |
parent | 986ad1338d0634b347cf39619964ceb4d4850713 (diff) | |
download | gcc-92fa7608a4401aa21b378c3cb786098e32677825.tar.gz |
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
-rw-r--r-- | gcc/lto/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/lto/lto-elf.c | 10 | ||||
-rw-r--r-- | gcc/lto/lto.c | 33 | ||||
-rw-r--r-- | gcc/lto/lto.h | 1 | ||||
-rw-r--r-- | lto-plugin/ChangeLog | 5 | ||||
-rw-r--r-- | lto-plugin/lto-plugin.c | 2 |
6 files changed, 43 insertions, 16 deletions
diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog index 54dabf2cc8a..6792d183a51 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 368d8d4d75f..7c5453a41bf 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 9cb7d65a60b..4d7c3079b49 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 3b92b41e9a3..0c4305a1731 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 d95cf05d9d0..d6e939419af 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 8cbafbc46cd..4a8a0ff5b7d 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; |