Mercurial > hg > CbC > CbC_gcc
diff lto-plugin/lto-plugin.c @ 63:b7f97abdc517 gcc-4.6-20100522
update gcc from gcc-4.5.0 to gcc-4.6
author | ryoma <e075725@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 24 May 2010 12:47:05 +0900 |
parents | 77e2b8dfacca |
children | f6334be47118 |
line wrap: on
line diff
--- a/lto-plugin/lto-plugin.c Fri Feb 12 23:41:23 2010 +0900 +++ b/lto-plugin/lto-plugin.c Mon May 24 12:47:05 2010 +0900 @@ -140,7 +140,7 @@ LDPV_HIDDEN }; - entry->name = strdup (p); + entry->name = xstrdup (p); while (*p) p++; p++; @@ -155,7 +155,7 @@ if (strlen (entry->comdat_key) == 0) entry->comdat_key = NULL; else - entry->comdat_key = strdup (entry->comdat_key); + entry->comdat_key = xstrdup (entry->comdat_key); t = *p; check (t <= 4, LDPL_FATAL, "invalid symbol kind found"); @@ -233,9 +233,9 @@ while (data < end) { n++; - syms = realloc (syms, n * sizeof (struct ld_plugin_symbol)); + syms = xrealloc (syms, n * sizeof (struct ld_plugin_symbol)); check (syms, LDPL_FATAL, "could not allocate memory"); - slots = realloc (slots, n * sizeof (uint32_t)); + slots = xrealloc (slots, n * sizeof (uint32_t)); check (slots, LDPL_FATAL, "could not allocate memory"); data = parse_table_entry (data, &syms[n - 1], &slots[n - 1]); } @@ -294,12 +294,6 @@ if (arguments_file_name) free (arguments_file_name); arguments_file_name = NULL; - - if (resolution_file) - { - free (resolution_file); - resolution_file = NULL; - } } /* Writes the relocations to disk. */ @@ -310,6 +304,7 @@ unsigned int i; FILE *f; + check (resolution_file, LDPL_FATAL, "resolution file not specified"); f = fopen (resolution_file, "w"); check (f, LDPL_FATAL, "could not open file"); @@ -322,7 +317,6 @@ struct ld_plugin_symbol *syms = symtab->syms; unsigned j; - assert (syms); get_symbols (info->handle, symtab->nsyms, syms); fprintf (f, "%s %d\n", info->name, info->symtab.nsyms); @@ -343,22 +337,29 @@ static void add_output_files (FILE *f) { - char fname[1000]; /* FIXME: Remove this restriction. */ - for (;;) { + const unsigned piece = 32; + char *buf, *s = xmalloc (piece); size_t len; - char *s = fgets (fname, sizeof (fname), f); - if (!s) + + buf = s; +cont: + if (!fgets (buf, piece, f)) break; - len = strlen (s); - check (s[len - 1] == '\n', LDPL_FATAL, "file name too long"); + if (s[len - 1] != '\n') + { + s = xrealloc (s, len + piece); + buf = s + len; + goto cont; + } s[len - 1] = '\0'; num_output_files++; - output_files = realloc (output_files, num_output_files * sizeof (char *)); - output_files[num_output_files - 1] = strdup (s); + output_files + = xrealloc (output_files, num_output_files * sizeof (char *)); + output_files[num_output_files - 1] = s; add_input_file (output_files[num_output_files - 1]); } } @@ -369,7 +370,7 @@ static void exec_lto_wrapper (char *argv[]) { - int t; + int t, i; int status; char *at_args; FILE *args; @@ -394,13 +395,24 @@ at_args = concat ("@", arguments_file_name, NULL); check (at_args, LDPL_FATAL, "could not allocate"); + for (i = 1; argv[i]; i++) + { + char *a = argv[i]; + if (a[0] == '-' && a[1] == 'v' && a[2] == '\0') + { + for (i = 0; argv[i]; i++) + fprintf (stderr, "%s ", argv[i]); + fprintf (stderr, "\n"); + break; + } + } + new_argv[0] = argv[0]; new_argv[1] = at_args; new_argv[2] = NULL; if (debug) { - int i; for (i = 0; new_argv[i]; i++) fprintf (stderr, "%s ", new_argv[i]); fprintf (stderr, "\n"); @@ -449,7 +461,7 @@ all_symbols_read_handler (void) { unsigned i; - unsigned num_lto_args = num_claimed_files + lto_wrapper_num_args + 2 + 1; + unsigned num_lto_args = num_claimed_files + lto_wrapper_num_args + 1; char **lto_argv; const char **lto_arg_ptr; if (num_claimed_files == 0) @@ -461,12 +473,10 @@ return LDPS_OK; } - lto_argv = (char **) calloc (sizeof (char *), num_lto_args); + lto_argv = (char **) xcalloc (sizeof (char *), num_lto_args); lto_arg_ptr = (const char **) lto_argv; assert (lto_wrapper_argv); - resolution_file = make_temp_file (""); - write_resolution (); free_1 (); @@ -474,9 +484,6 @@ for (i = 0; i < lto_wrapper_num_args; i++) *lto_arg_ptr++ = lto_wrapper_argv[i]; - *lto_arg_ptr++ = "-fresolution"; - *lto_arg_ptr++ = resolution_file; - for (i = 0; i < num_claimed_files; i++) { struct plugin_file_info *info = &claimed_files[i]; @@ -513,6 +520,7 @@ static enum ld_plugin_status cleanup_handler (void) { + unsigned int i; int t; if (debug) @@ -524,10 +532,10 @@ check (t == 0, LDPL_FATAL, "could not unlink arguments file"); } - if (resolution_file) + for (i = 0; i < num_output_files; i++) { - t = unlink (resolution_file); - check (t == 0, LDPL_FATAL, "could not unlink resolution file"); + t = unlink (output_files[i]); + check (t == 0, LDPL_FATAL, "could not unlink output file"); } free_2 (); @@ -573,7 +581,7 @@ } else { - lto_file.name = strdup (file->name); + lto_file.name = xstrdup (file->name); elf = elf_begin (file->fd, ELF_C_READ, NULL); } lto_file.handle = file->handle; @@ -596,8 +604,8 @@ *claimed = 1; num_claimed_files++; claimed_files = - realloc (claimed_files, - num_claimed_files * sizeof (struct plugin_file_info)); + xrealloc (claimed_files, + num_claimed_files * sizeof (struct plugin_file_info)); claimed_files[num_claimed_files - 1] = lto_file; goto cleanup; @@ -624,18 +632,21 @@ else if (!strncmp (option, "-pass-through=", strlen("-pass-through="))) { num_pass_through_items++; - pass_through_items = realloc (pass_through_items, - num_pass_through_items * sizeof (char *)); + pass_through_items = xrealloc (pass_through_items, + num_pass_through_items * sizeof (char *)); pass_through_items[num_pass_through_items - 1] = - strdup (option + strlen ("-pass-through=")); + xstrdup (option + strlen ("-pass-through=")); } else { int size; + char *opt = xstrdup (option); lto_wrapper_num_args += 1; size = lto_wrapper_num_args * sizeof (char *); - lto_wrapper_argv = (char **) realloc (lto_wrapper_argv, size); - lto_wrapper_argv[lto_wrapper_num_args - 1] = strdup(option); + lto_wrapper_argv = (char **) xrealloc (lto_wrapper_argv, size); + lto_wrapper_argv[lto_wrapper_num_args - 1] = opt; + if (strncmp (option, "-fresolution=", sizeof ("-fresolution=") - 1) == 0) + resolution_file = opt + sizeof ("-fresolution=") - 1; } }