mkoffload's generated .c file looks much nicer with '#embed'.
This patch depends on Jakub's #embed patch at https://gcc.gnu.org/pipermail/gcc-patches/2024-June/655012.html It might be a tiny bit faster than currently (or not); however, once #embed has a large-file mode, it should also speed up the offloading compilation quit a bit. OK for mainline, once '#embed' support is in? Tobias
gcn/mkoffload.cc: Use #embed for including the generated ELF file gcc/ChangeLog: * config/gcn/mkoffload.cc (read_file): Remove. (process_obj): Generate C file that uses #embed. (main): Update call to it; remove no longer needed file I/O. gcc/config/gcn/mkoffload.cc | 66 +++++++++------------------------------------ 1 file changed, 12 insertions(+), 54 deletions(-) diff --git a/gcc/config/gcn/mkoffload.cc b/gcc/config/gcn/mkoffload.cc index 810298a799b..0ccb874398a 100644 --- a/gcc/config/gcn/mkoffload.cc +++ b/gcc/config/gcn/mkoffload.cc @@ -182,44 +182,6 @@ xputenv (const char *string) putenv (CONST_CAST (char *, string)); } -/* Read the whole input file. It will be NUL terminated (but - remember, there could be a NUL in the file itself. */ - -static const char * -read_file (FILE *stream, size_t *plen) -{ - size_t alloc = 16384; - size_t base = 0; - char *buffer; - - if (!fseek (stream, 0, SEEK_END)) - { - /* Get the file size. */ - long s = ftell (stream); - if (s >= 0) - alloc = s + 100; - fseek (stream, 0, SEEK_SET); - } - buffer = XNEWVEC (char, alloc); - - for (;;) - { - size_t n = fread (buffer + base, 1, alloc - base - 1, stream); - - if (!n) - break; - base += n; - if (base + 1 == alloc) - { - alloc *= 2; - buffer = XRESIZEVEC (char, buffer, alloc); - } - } - buffer[base] = 0; - *plen = base; - return buffer; -} - /* Parse STR, saving found tokens into PVALUES and return their number. Tokens are assumed to be delimited by ':'. */ @@ -725,31 +687,27 @@ process_asm (FILE *in, FILE *out, FILE *cfile) /* Embed an object file into a C source file. */ static void -process_obj (FILE *in, FILE *cfile, uint32_t omp_requires) +process_obj (const char *fname_in, FILE *cfile, uint32_t omp_requires) { - size_t len = 0; - const char *input = read_file (in, &len); - /* Dump out an array containing the binary. FIXME: do this with objcopy. */ - fprintf (cfile, "static unsigned char gcn_code[] = {"); - for (size_t i = 0; i < len; i += 17) - { - fprintf (cfile, "\n\t"); - for (size_t j = i; j < i + 17 && j < len; j++) - fprintf (cfile, "%3u,", (unsigned char) input[j]); - } - fprintf (cfile, "\n};\n\n"); + fprintf (cfile, + "static unsigned char gcn_code[] = {\n" + "#if defined(__STDC_EMBED_FOUND__) && __has_embed (\"%s\") == __STDC_EMBED_FOUND__\n" + "#embed \"%s\"\n" + "#else\n" + "#error \"#embed '%s' failed\"\n" + "#endif\n" + "};\n\n", fname_in, fname_in, fname_in); fprintf (cfile, "static const struct gcn_image {\n" " size_t size;\n" " void *image;\n" "} gcn_image = {\n" - " %zu,\n" + " sizeof(gcn_code),\n" " gcn_code\n" - "};\n\n", - len); + "};\n\n"); fprintf (cfile, "static const struct gcn_data {\n" @@ -1316,7 +1274,7 @@ main (int argc, char **argv) if (!in) fatal_error (input_location, "cannot open intermediate gcn obj file"); - process_obj (in, cfile, omp_requires); + process_obj (gcn_o_name, cfile, omp_requires); fclose (in);