diff options
author | Rafael Avila de Espindola <espindola@google.com> | 2009-11-17 16:00:19 +0000 |
---|---|---|
committer | Rafael Espindola <espindola@gcc.gnu.org> | 2009-11-17 16:00:19 +0000 |
commit | 9870fe4f883ad20482ade6a4044657d738daa337 (patch) | |
tree | c38a89384c9700e550405c672c972476d186d9a3 /gcc/lto | |
parent | 6ca19a974b25008e1e9e9c68c34a904b1b12fb4d (diff) | |
download | gcc-9870fe4f883ad20482ade6a4044657d738daa337.zip gcc-9870fe4f883ad20482ade6a4044657d738daa337.tar.gz gcc-9870fe4f883ad20482ade6a4044657d738daa337.tar.bz2 |
lto-elf.c (lto_file_init): Add offset argument.
2009-11-17 Rafael Avila de Espindola <espindola@google.com>
* lto-elf.c (lto_file_init): Add offset argument.
(lto_elf_file_open): Record the offset.
* lto.c (lto_resolution_read): Change file_name into a lto_file
argument. Check offsets.
(lto_file_read): Update call to lto_resolution_read.
* lto.h (lto_file_struct): Add the offset field.
From-SVN: r154251
Diffstat (limited to 'gcc/lto')
-rw-r--r-- | gcc/lto/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/lto/lto-elf.c | 13 | ||||
-rw-r--r-- | gcc/lto/lto.c | 25 | ||||
-rw-r--r-- | gcc/lto/lto.h | 1 |
4 files changed, 38 insertions, 10 deletions
diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog index b37c549..54dabf2 100644 --- a/gcc/lto/ChangeLog +++ b/gcc/lto/ChangeLog @@ -1,3 +1,12 @@ +2009-11-17 Rafael Avila de Espindola <espindola@google.com> + + * lto-elf.c (lto_file_init): Add offset argument. + (lto_elf_file_open): Record the offset. + * lto.c (lto_resolution_read): Change file_name into a lto_file + argument. Check offsets. + (lto_file_read): Update call to lto_resolution_read. + * lto.h (lto_file_struct): Add the offset field. + 2009-11-16 Rafael Avila de Espindola <espindola@google.com> * lto-elf.c (lto_elf_file_open): Use strtoll to parse the offset. diff --git a/gcc/lto/lto-elf.c b/gcc/lto/lto-elf.c index bc8e137..368d8d4d 100644 --- a/gcc/lto/lto-elf.c +++ b/gcc/lto/lto-elf.c @@ -32,9 +32,10 @@ along with GCC; see the file COPYING3. If not see /* Initialize FILE, an LTO file object for FILENAME. */ static void -lto_file_init (lto_file *file, const char *filename) +lto_file_init (lto_file *file, const char *filename, off_t offset) { file->filename = filename; + file->offset = offset; } /* An ELF file. */ @@ -542,6 +543,7 @@ lto_elf_file_open (const char *filename, bool writable) lto_elf_file *elf_file; lto_file *result = NULL; off_t offset; + off_t header_offset; const char *offset_p; char *fname; @@ -550,6 +552,7 @@ lto_elf_file_open (const char *filename, bool writable) { fname = xstrdup (filename); offset = 0; + header_offset = 0; } else { @@ -567,13 +570,13 @@ lto_elf_file_open (const char *filename, bool writable) /* 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 */ - offset -= 60; + header_offset = offset - 60; } /* Set up. */ elf_file = XCNEW (lto_elf_file); result = (lto_file *) elf_file; - lto_file_init (result, fname); + lto_file_init (result, fname, offset); elf_file->fd = -1; /* Open the file. */ @@ -603,8 +606,8 @@ lto_elf_file_open (const char *filename, bool writable) if (offset != 0) { Elf *e; - off_t t = elf_rand (elf_file->elf, offset); - if (t != offset) + off_t t = elf_rand (elf_file->elf, header_offset); + if (t != header_offset) { error ("could not seek in archive"); goto fail; diff --git a/gcc/lto/lto.c b/gcc/lto/lto.c index 40f3c30..9cb7d65 100644 --- a/gcc/lto/lto.c +++ b/gcc/lto/lto.c @@ -254,7 +254,7 @@ lto_read_decls (struct lto_file_decl_data *decl_data, const void *data, size is written to SIZE. */ static VEC(ld_plugin_symbol_resolution_t,heap) * -lto_resolution_read (FILE *resolution, const char *file_name) +lto_resolution_read (FILE *resolution, lto_file *file) { /* We require that objects in the resolution file are in the same order as the lto1 command line. */ @@ -268,15 +268,30 @@ lto_resolution_read (FILE *resolution, const char *file_name) if (!resolution) return NULL; - name_len = strlen (file_name); + name_len = strlen (file->filename); obj_name = XNEWVEC (char, name_len + 1); fscanf (resolution, " "); /* Read white space. */ fread (obj_name, sizeof (char), name_len, resolution); obj_name[name_len] = '\0'; - if (strcmp (obj_name, file_name) != 0) + if (strcmp (obj_name, file->filename) != 0) internal_error ("unexpected file name %s in linker resolution file. " - "Expected %s", obj_name, file_name); + "Expected %s", obj_name, file->filename); + if (file->offset != 0) + { + int t; + char offset_p[21]; + long long offset; + t = fscanf (resolution, "@%20s", 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"); + if (offset != file->offset) + internal_error ("unexpected offset"); + } free (obj_name); @@ -332,7 +347,7 @@ lto_file_read (lto_file *file, FILE *resolution_file) size_t len; VEC(ld_plugin_symbol_resolution_t,heap) *resolutions; - resolutions = lto_resolution_read (resolution_file, file->filename); + resolutions = lto_resolution_read (resolution_file, file); file_data = XCNEW (struct lto_file_decl_data); file_data->file_name = file->filename; diff --git a/gcc/lto/lto.h b/gcc/lto/lto.h index cdd1e06..3b92b41 100644 --- a/gcc/lto/lto.h +++ b/gcc/lto/lto.h @@ -28,6 +28,7 @@ typedef struct lto_file_struct { /* The name of the file. */ const char *filename; + off_t offset; } lto_file; /* In lto-lang.c */ |