From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from esa3.mentor.iphmx.com (esa3.mentor.iphmx.com [68.232.137.180]) by sourceware.org (Postfix) with ESMTPS id 24CC938708DA for ; Thu, 14 Jan 2021 19:19:17 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 24CC938708DA Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=codesourcery.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=Thomas_Schwinge@mentor.com IronPort-SDR: r/FO9ZPpuZiKA6PkiNHWjvpRGYtTmKh4YS0V6cWR9VWrzf9oD5hAEJ1T+lSD0TmOkplxC+p7V8 IYOFFBt83HNJ/TkYodaYavzha3/fyfUeIjLBlXHsgV1MlzCTTnfOAVpvi1SlNGC2RZqjgFWfc3 YRMovjVcNlf9/SSCDdVERoCnaDOn8LjubDD/GBzKcVsxzcQX6VQsQ2hvPgFALGoKfDiMfSctvd cRkXItdUGj6/jaeNNWtE1n9icQwAKZn/T4Q3J+8wGAdpJw/LnjzwrDQIVlhA25pMl9P8+CQZZC QaA= X-IronPort-AV: E=Sophos;i="5.79,347,1602576000"; d="scan'208,223";a="57086068" Received: from orw-gwy-01-in.mentorg.com ([192.94.38.165]) by esa3.mentor.iphmx.com with ESMTP; 14 Jan 2021 11:19:15 -0800 IronPort-SDR: 2QE2PPeLW74pavSgOGKRiG68M1EGVLegmJso+ZyEQrU7G2hNRpiPHUZhLpLEQU60RB1hxRLRSl PVa0o/AHIgLKywMyJaMrL5R7EjAapNRa+v1dHOuSECbL3uJTdPSr6c9LM0QYs0n51mAgtnjaQS nJuTTr5UDguP6+DHcNwivTvr3gsVivM28WJSLjrcEYbTGDeZ6CXR8EwiIHLIADLP3j/WjzNu1G gCTYJB/aK5ssodUctnjAo98iT41NTHWAtdCFpnt8xwJJLA+FcPqUsn9kuryK57XnM8G+bCYY50 534= From: Thomas Schwinge To: Andrew Stubbs , Subject: [gcn offloading] Only supported in 64-bit configurations (was: [PATCH 7/7 libgomp,amdgcn] GCN Libgomp Plugin) In-Reply-To: <8c5112624e3cd17dd478d0ca5a59b2d24d1b16a5.1573560401.git.ams@codesourcery.com> References: <8c5112624e3cd17dd478d0ca5a59b2d24d1b16a5.1573560401.git.ams@codesourcery.com> User-Agent: Notmuch/0.29.3+94~g74c3f1b (https://notmuchmail.org) Emacs/27.1 (x86_64-pc-linux-gnu) Date: Thu, 14 Jan 2021 20:19:05 +0100 Message-ID: <87im7ziaxi.fsf@euler.schwinge.homeip.net> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Originating-IP: [137.202.0.90] X-ClientProxiedBy: svr-ies-mbx-09.mgc.mentorg.com (139.181.222.9) To svr-ies-mbx-01.mgc.mentorg.com (139.181.222.1) X-Spam-Status: No, score=-12.8 required=5.0 tests=BAYES_00, GIT_PATCH_0, HEADER_FROM_DIFFERENT_DOMAINS, KAM_DMARC_STATUS, KAM_LOTSOFHASH, SPF_HELO_PASS, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 14 Jan 2021 19:19:20 -0000 --=-=-= Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Hi! On 2019-11-12T13:29:16+0000, Andrew Stubbs wrote: > This patch contributes the GCN libgomp plugin, with the various > configure and make bits to go with it. > --- a/libgomp/plugin/configfrag.ac > +++ b/libgomp/plugin/configfrag.ac > + amdgcn*) > + case "${target}" in > + x86_64-*-*) > + case " ${CC} ${CFLAGS} " in > + *" -m32 "*) > + PLUGIN_GCN=3D0 That means, for good reasons, the GCN libgomp plugin is only built in 64-bit configurations. However, in a (standard) bi-arch x86_64-pc-linux-gnu '-m64'/'-m32' build, the compiler will still attempt 32-bit GCN offloading code generation, which will often fail horribly (several classes of ICEs), is untested, and not intended to be supported, as Andrew confirmed to me months ago. So, we shouldn't try to do that; similar to nvptx offloading, see PR65099 "nvptx offloading: hard-coded 64-bit assumptions". As obvious, I've just pushed "[gcn offloading] Only supported in 64-bit configurations" to master branch in commit 505caa7295b93ecdec8ac9b31595eb34dbd48c9f, and cherry-picked into releases/gcc-10 branch in commit d697bf91a5457dfb06b4112b89dec2e43f472830, see attached. Gr=C3=BC=C3=9Fe Thomas ----------------- Mentor Graphics (Deutschland) GmbH, Arnulfstra=C3=9Fe 201, 80634 M=C3=BCnch= en / Germany Registergericht M=C3=BCnchen HRB 106955, Gesch=C3=A4ftsf=C3=BChrer: Thomas = Heurung, Alexander Walter --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename="0001-gcn-offloading-Only-supported-in-64-bit-configuratio.patch" >From 505caa7295b93ecdec8ac9b31595eb34dbd48c9f Mon Sep 17 00:00:00 2001 From: Thomas Schwinge Date: Tue, 28 Apr 2020 20:43:38 +0200 Subject: [PATCH] [gcn offloading] Only supported in 64-bit configurations Similar to nvptx offloading, see PR65099 "nvptx offloading: hard-coded 64-bit assumptions". gcc/ * config/gcn/mkoffload.c (main): Create an offload image only in 64-bit configurations. --- gcc/config/gcn/mkoffload.c | 260 +++++++++++++++++++------------------ 1 file changed, 134 insertions(+), 126 deletions(-) diff --git a/gcc/config/gcn/mkoffload.c b/gcc/config/gcn/mkoffload.c index 7d00aaf507e..eb1c717e6e9 100644 --- a/gcc/config/gcn/mkoffload.c +++ b/gcc/config/gcn/mkoffload.c @@ -755,11 +755,6 @@ main (int argc, char **argv) FILE *cfile = stdout; const char *outname = 0; - const char *gcn_s1_name; - const char *gcn_s2_name; - const char *gcn_o_name; - const char *gcn_cfile_name; - progname = "mkoffload"; diagnostic_initialize (global_dc, 0); @@ -905,145 +900,158 @@ main (int argc, char **argv) if (!dumppfx) dumppfx = outname; - const char *mko_dumpbase = concat (dumppfx, ".mkoffload", NULL); - const char *hsaco_dumpbase = concat (dumppfx, ".mkoffload.hsaco", NULL); gcn_dumpbase = concat (dumppfx, ".c", NULL); + const char *gcn_cfile_name; if (save_temps) - { - gcn_s1_name = concat (mko_dumpbase, ".1.s", NULL); - gcn_s2_name = concat (mko_dumpbase, ".2.s", NULL); - gcn_o_name = hsaco_dumpbase; - gcn_cfile_name = gcn_dumpbase; - } + gcn_cfile_name = gcn_dumpbase; else - { - gcn_s1_name = make_temp_file (".mkoffload.1.s"); - gcn_s2_name = make_temp_file (".mkoffload.2.s"); - gcn_o_name = make_temp_file (".mkoffload.hsaco"); - gcn_cfile_name = make_temp_file (".c"); - } - obstack_ptr_grow (&files_to_cleanup, gcn_s1_name); - obstack_ptr_grow (&files_to_cleanup, gcn_s2_name); - obstack_ptr_grow (&files_to_cleanup, gcn_o_name); + gcn_cfile_name = make_temp_file (".c"); obstack_ptr_grow (&files_to_cleanup, gcn_cfile_name); - obstack_ptr_grow (&cc_argv_obstack, "-dumpdir"); - obstack_ptr_grow (&cc_argv_obstack, ""); - obstack_ptr_grow (&cc_argv_obstack, "-dumpbase"); - obstack_ptr_grow (&cc_argv_obstack, mko_dumpbase); - obstack_ptr_grow (&cc_argv_obstack, "-dumpbase-ext"); - obstack_ptr_grow (&cc_argv_obstack, ""); - - obstack_ptr_grow (&cc_argv_obstack, "-o"); - obstack_ptr_grow (&cc_argv_obstack, gcn_s1_name); - obstack_ptr_grow (&cc_argv_obstack, NULL); - const char **cc_argv = XOBFINISH (&cc_argv_obstack, const char **); - - /* Build arguments for assemble/link pass. */ - struct obstack ld_argv_obstack; - obstack_init (&ld_argv_obstack); - obstack_ptr_grow (&ld_argv_obstack, driver); - - /* Extract early-debug information from the input objects. - This loop finds all the inputs that end ".o" and aren't the output. */ - int dbgcount = 0; - for (int ix = 1; ix != argc; ix++) + cfile = fopen (gcn_cfile_name, "w"); + if (!cfile) + fatal_error (input_location, "cannot open '%s'", gcn_cfile_name); + + /* Currently, we only support offloading in 64-bit configurations. */ + if (offload_abi == OFFLOAD_ABI_LP64) { - if (!strcmp (argv[ix], "-o") && ix + 1 != argc) - ++ix; + const char *mko_dumpbase = concat (dumppfx, ".mkoffload", NULL); + const char *hsaco_dumpbase = concat (dumppfx, ".mkoffload.hsaco", NULL); + + const char *gcn_s1_name; + const char *gcn_s2_name; + const char *gcn_o_name; + if (save_temps) + { + gcn_s1_name = concat (mko_dumpbase, ".1.s", NULL); + gcn_s2_name = concat (mko_dumpbase, ".2.s", NULL); + gcn_o_name = hsaco_dumpbase; + } else { - if (strcmp (argv[ix] + strlen(argv[ix]) - 2, ".o") == 0) + gcn_s1_name = make_temp_file (".mkoffload.1.s"); + gcn_s2_name = make_temp_file (".mkoffload.2.s"); + gcn_o_name = make_temp_file (".mkoffload.hsaco"); + } + obstack_ptr_grow (&files_to_cleanup, gcn_s1_name); + obstack_ptr_grow (&files_to_cleanup, gcn_s2_name); + obstack_ptr_grow (&files_to_cleanup, gcn_o_name); + + obstack_ptr_grow (&cc_argv_obstack, "-dumpdir"); + obstack_ptr_grow (&cc_argv_obstack, ""); + obstack_ptr_grow (&cc_argv_obstack, "-dumpbase"); + obstack_ptr_grow (&cc_argv_obstack, mko_dumpbase); + obstack_ptr_grow (&cc_argv_obstack, "-dumpbase-ext"); + obstack_ptr_grow (&cc_argv_obstack, ""); + + obstack_ptr_grow (&cc_argv_obstack, "-o"); + obstack_ptr_grow (&cc_argv_obstack, gcn_s1_name); + obstack_ptr_grow (&cc_argv_obstack, NULL); + const char **cc_argv = XOBFINISH (&cc_argv_obstack, const char **); + + /* Build arguments for assemble/link pass. */ + struct obstack ld_argv_obstack; + obstack_init (&ld_argv_obstack); + obstack_ptr_grow (&ld_argv_obstack, driver); + + /* Extract early-debug information from the input objects. + This loop finds all the inputs that end ".o" and aren't the output. */ + int dbgcount = 0; + for (int ix = 1; ix != argc; ix++) + { + if (!strcmp (argv[ix], "-o") && ix + 1 != argc) + ++ix; + else { - char *dbgobj; - if (save_temps) - { - char buf[10]; - sprintf (buf, "%d", dbgcount++); - dbgobj = concat (dumppfx, ".mkoffload.dbg", buf, ".o", NULL); - } - else - dbgobj = make_temp_file (".mkoffload.dbg.o"); - - /* If the copy fails then just ignore it. */ - if (copy_early_debug_info (argv[ix], dbgobj)) + if (strcmp (argv[ix] + strlen(argv[ix]) - 2, ".o") == 0) { - obstack_ptr_grow (&ld_argv_obstack, dbgobj); - obstack_ptr_grow (&files_to_cleanup, dbgobj); + char *dbgobj; + if (save_temps) + { + char buf[10]; + sprintf (buf, "%d", dbgcount++); + dbgobj = concat (dumppfx, ".mkoffload.dbg", buf, ".o", NULL); + } + else + dbgobj = make_temp_file (".mkoffload.dbg.o"); + + /* If the copy fails then just ignore it. */ + if (copy_early_debug_info (argv[ix], dbgobj)) + { + obstack_ptr_grow (&ld_argv_obstack, dbgobj); + obstack_ptr_grow (&files_to_cleanup, dbgobj); + } + else + free (dbgobj); } - else - free (dbgobj); } } + obstack_ptr_grow (&ld_argv_obstack, gcn_s2_name); + obstack_ptr_grow (&ld_argv_obstack, "-lgomp"); + + for (int i = 1; i < argc; i++) + if (strncmp (argv[i], "-l", 2) == 0 + || strncmp (argv[i], "-Wl", 3) == 0 + || strncmp (argv[i], "-march", 6) == 0) + obstack_ptr_grow (&ld_argv_obstack, argv[i]); + + obstack_ptr_grow (&cc_argv_obstack, "-dumpdir"); + obstack_ptr_grow (&cc_argv_obstack, ""); + obstack_ptr_grow (&cc_argv_obstack, "-dumpbase"); + obstack_ptr_grow (&cc_argv_obstack, hsaco_dumpbase); + obstack_ptr_grow (&cc_argv_obstack, "-dumpbase-ext"); + obstack_ptr_grow (&cc_argv_obstack, ""); + + obstack_ptr_grow (&ld_argv_obstack, "-o"); + obstack_ptr_grow (&ld_argv_obstack, gcn_o_name); + obstack_ptr_grow (&ld_argv_obstack, NULL); + const char **ld_argv = XOBFINISH (&ld_argv_obstack, const char **); + + /* Clean up unhelpful environment variables. */ + char *execpath = getenv ("GCC_EXEC_PREFIX"); + char *cpath = getenv ("COMPILER_PATH"); + char *lpath = getenv ("LIBRARY_PATH"); + unsetenv ("GCC_EXEC_PREFIX"); + unsetenv ("COMPILER_PATH"); + unsetenv ("LIBRARY_PATH"); + + /* Run the compiler pass. */ + fork_execute (cc_argv[0], CONST_CAST (char **, cc_argv), true, ".gcc_args"); + obstack_free (&cc_argv_obstack, NULL); + + in = fopen (gcn_s1_name, "r"); + if (!in) + fatal_error (input_location, "cannot open intermediate gcn asm file"); + + out = fopen (gcn_s2_name, "w"); + if (!out) + fatal_error (input_location, "cannot open '%s'", gcn_s2_name); + + process_asm (in, out, cfile); + + fclose (in); + fclose (out); + + /* Run the assemble/link pass. */ + fork_execute (ld_argv[0], CONST_CAST (char **, ld_argv), true, ".ld_args"); + obstack_free (&ld_argv_obstack, NULL); + + in = fopen (gcn_o_name, "r"); + if (!in) + fatal_error (input_location, "cannot open intermediate gcn obj file"); + + process_obj (in, cfile); + + fclose (in); + + xputenv (concat ("GCC_EXEC_PREFIX=", execpath, NULL)); + xputenv (concat ("COMPILER_PATH=", cpath, NULL)); + xputenv (concat ("LIBRARY_PATH=", lpath, NULL)); } - obstack_ptr_grow (&ld_argv_obstack, gcn_s2_name); - obstack_ptr_grow (&ld_argv_obstack, "-lgomp"); - for (int i = 1; i < argc; i++) - if (strncmp (argv[i], "-l", 2) == 0 - || strncmp (argv[i], "-Wl", 3) == 0 - || strncmp (argv[i], "-march", 6) == 0) - obstack_ptr_grow (&ld_argv_obstack, argv[i]); - - obstack_ptr_grow (&cc_argv_obstack, "-dumpdir"); - obstack_ptr_grow (&cc_argv_obstack, ""); - obstack_ptr_grow (&cc_argv_obstack, "-dumpbase"); - obstack_ptr_grow (&cc_argv_obstack, hsaco_dumpbase); - obstack_ptr_grow (&cc_argv_obstack, "-dumpbase-ext"); - obstack_ptr_grow (&cc_argv_obstack, ""); - - obstack_ptr_grow (&ld_argv_obstack, "-o"); - obstack_ptr_grow (&ld_argv_obstack, gcn_o_name); - obstack_ptr_grow (&ld_argv_obstack, NULL); - const char **ld_argv = XOBFINISH (&ld_argv_obstack, const char **); - - /* Clean up unhelpful environment variables. */ - char *execpath = getenv ("GCC_EXEC_PREFIX"); - char *cpath = getenv ("COMPILER_PATH"); - char *lpath = getenv ("LIBRARY_PATH"); - unsetenv ("GCC_EXEC_PREFIX"); - unsetenv ("COMPILER_PATH"); - unsetenv ("LIBRARY_PATH"); - - /* Run the compiler pass. */ - fork_execute (cc_argv[0], CONST_CAST (char **, cc_argv), true, ".gcc_args"); - obstack_free (&cc_argv_obstack, NULL); - - in = fopen (gcn_s1_name, "r"); - if (!in) - fatal_error (input_location, "cannot open intermediate gcn asm file"); - - out = fopen (gcn_s2_name, "w"); - if (!out) - fatal_error (input_location, "cannot open '%s'", gcn_s2_name); - - cfile = fopen (gcn_cfile_name, "w"); - if (!cfile) - fatal_error (input_location, "cannot open '%s'", gcn_cfile_name); - - process_asm (in, out, cfile); - - fclose (in); - fclose (out); - - /* Run the assemble/link pass. */ - fork_execute (ld_argv[0], CONST_CAST (char **, ld_argv), true, ".ld_args"); - obstack_free (&ld_argv_obstack, NULL); - - in = fopen (gcn_o_name, "r"); - if (!in) - fatal_error (input_location, "cannot open intermediate gcn obj file"); - - process_obj (in, cfile); - - fclose (in); fclose (cfile); - xputenv (concat ("GCC_EXEC_PREFIX=", execpath, NULL)); - xputenv (concat ("COMPILER_PATH=", cpath, NULL)); - xputenv (concat ("LIBRARY_PATH=", lpath, NULL)); - compile_native (gcn_cfile_name, outname, collect_gcc, fPIC, fpic); return 0; -- 2.17.1 --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename="0001-gcn-offloading-Only-supported-in-64-bit-configur.g10.patch" >From d697bf91a5457dfb06b4112b89dec2e43f472830 Mon Sep 17 00:00:00 2001 From: Thomas Schwinge Date: Tue, 28 Apr 2020 20:43:38 +0200 Subject: [PATCH] [gcn offloading] Only supported in 64-bit configurations Similar to nvptx offloading, see PR65099 "nvptx offloading: hard-coded 64-bit assumptions". gcc/ * config/gcn/mkoffload.c (main): Create an offload image only in 64-bit configurations. (cherry picked from commit 505caa7295b93ecdec8ac9b31595eb34dbd48c9f) --- gcc/config/gcn/mkoffload.c | 142 +++++++++++++++++++------------------ 1 file changed, 74 insertions(+), 68 deletions(-) diff --git a/gcc/config/gcn/mkoffload.c b/gcc/config/gcn/mkoffload.c index 723da108b65..76947e19f79 100644 --- a/gcc/config/gcn/mkoffload.c +++ b/gcc/config/gcn/mkoffload.c @@ -628,11 +628,6 @@ main (int argc, char **argv) gcc_unreachable (); } - gcn_s1_name = make_temp_file (".mkoffload.1.s"); - gcn_s2_name = make_temp_file (".mkoffload.2.s"); - gcn_o_name = make_temp_file (".mkoffload.hsaco"); - gcn_cfile_name = make_temp_file (".c"); - /* Build arguments for compiler pass. */ struct obstack cc_argv_obstack; obstack_init (&cc_argv_obstack); @@ -661,77 +656,88 @@ main (int argc, char **argv) } } - obstack_ptr_grow (&cc_argv_obstack, "-o"); - obstack_ptr_grow (&cc_argv_obstack, gcn_s1_name); - obstack_ptr_grow (&cc_argv_obstack, - concat ("-mlocal-symbol-id=", offloadsrc, NULL)); - obstack_ptr_grow (&cc_argv_obstack, NULL); - const char **cc_argv = XOBFINISH (&cc_argv_obstack, const char **); - - /* Build arguments for assemble/link pass. */ - struct obstack ld_argv_obstack; - obstack_init (&ld_argv_obstack); - obstack_ptr_grow (&ld_argv_obstack, driver); - obstack_ptr_grow (&ld_argv_obstack, gcn_s2_name); - obstack_ptr_grow (&ld_argv_obstack, "-lgomp"); - - for (int i = 1; i < argc; i++) - if (strncmp (argv[i], "-l", 2) == 0 - || strncmp (argv[i], "-Wl", 3) == 0 - || strncmp (argv[i], "-march", 6) == 0) - obstack_ptr_grow (&ld_argv_obstack, argv[i]); - - obstack_ptr_grow (&ld_argv_obstack, "-o"); - obstack_ptr_grow (&ld_argv_obstack, gcn_o_name); - obstack_ptr_grow (&ld_argv_obstack, NULL); - const char **ld_argv = XOBFINISH (&ld_argv_obstack, const char **); - - /* Clean up unhelpful environment variables. */ - char *execpath = getenv ("GCC_EXEC_PREFIX"); - char *cpath = getenv ("COMPILER_PATH"); - char *lpath = getenv ("LIBRARY_PATH"); - unsetenv ("GCC_EXEC_PREFIX"); - unsetenv ("COMPILER_PATH"); - unsetenv ("LIBRARY_PATH"); - - /* Run the compiler pass. */ - fork_execute (cc_argv[0], CONST_CAST (char **, cc_argv), true); - obstack_free (&cc_argv_obstack, NULL); - - in = fopen (gcn_s1_name, "r"); - if (!in) - fatal_error (input_location, "cannot open intermediate gcn asm file"); - - out = fopen (gcn_s2_name, "w"); - if (!out) - fatal_error (input_location, "cannot open '%s'", gcn_s2_name); + gcn_cfile_name = make_temp_file (".c"); cfile = fopen (gcn_cfile_name, "w"); if (!cfile) fatal_error (input_location, "cannot open '%s'", gcn_cfile_name); - process_asm (in, out, cfile); - - fclose (in); - fclose (out); - - /* Run the assemble/link pass. */ - fork_execute (ld_argv[0], CONST_CAST (char **, ld_argv), true); - obstack_free (&ld_argv_obstack, NULL); - - in = fopen (gcn_o_name, "r"); - if (!in) - fatal_error (input_location, "cannot open intermediate gcn obj file"); - - process_obj (in, cfile); + /* Currently, we only support offloading in 64-bit configurations. */ + if (offload_abi == OFFLOAD_ABI_LP64) + { + gcn_s1_name = make_temp_file (".mkoffload.1.s"); + gcn_s2_name = make_temp_file (".mkoffload.2.s"); + gcn_o_name = make_temp_file (".mkoffload.hsaco"); + + obstack_ptr_grow (&cc_argv_obstack, "-o"); + obstack_ptr_grow (&cc_argv_obstack, gcn_s1_name); + obstack_ptr_grow (&cc_argv_obstack, + concat ("-mlocal-symbol-id=", offloadsrc, NULL)); + obstack_ptr_grow (&cc_argv_obstack, NULL); + const char **cc_argv = XOBFINISH (&cc_argv_obstack, const char **); + + /* Build arguments for assemble/link pass. */ + struct obstack ld_argv_obstack; + obstack_init (&ld_argv_obstack); + obstack_ptr_grow (&ld_argv_obstack, driver); + obstack_ptr_grow (&ld_argv_obstack, gcn_s2_name); + obstack_ptr_grow (&ld_argv_obstack, "-lgomp"); + + for (int i = 1; i < argc; i++) + if (strncmp (argv[i], "-l", 2) == 0 + || strncmp (argv[i], "-Wl", 3) == 0 + || strncmp (argv[i], "-march", 6) == 0) + obstack_ptr_grow (&ld_argv_obstack, argv[i]); + + obstack_ptr_grow (&ld_argv_obstack, "-o"); + obstack_ptr_grow (&ld_argv_obstack, gcn_o_name); + obstack_ptr_grow (&ld_argv_obstack, NULL); + const char **ld_argv = XOBFINISH (&ld_argv_obstack, const char **); + + /* Clean up unhelpful environment variables. */ + char *execpath = getenv ("GCC_EXEC_PREFIX"); + char *cpath = getenv ("COMPILER_PATH"); + char *lpath = getenv ("LIBRARY_PATH"); + unsetenv ("GCC_EXEC_PREFIX"); + unsetenv ("COMPILER_PATH"); + unsetenv ("LIBRARY_PATH"); + + /* Run the compiler pass. */ + fork_execute (cc_argv[0], CONST_CAST (char **, cc_argv), true); + obstack_free (&cc_argv_obstack, NULL); + + in = fopen (gcn_s1_name, "r"); + if (!in) + fatal_error (input_location, "cannot open intermediate gcn asm file"); + + out = fopen (gcn_s2_name, "w"); + if (!out) + fatal_error (input_location, "cannot open '%s'", gcn_s2_name); + + process_asm (in, out, cfile); + + fclose (in); + fclose (out); + + /* Run the assemble/link pass. */ + fork_execute (ld_argv[0], CONST_CAST (char **, ld_argv), true); + obstack_free (&ld_argv_obstack, NULL); + + in = fopen (gcn_o_name, "r"); + if (!in) + fatal_error (input_location, "cannot open intermediate gcn obj file"); + + process_obj (in, cfile); + + fclose (in); + + xputenv (concat ("GCC_EXEC_PREFIX=", execpath, NULL)); + xputenv (concat ("COMPILER_PATH=", cpath, NULL)); + xputenv (concat ("LIBRARY_PATH=", lpath, NULL)); + } - fclose (in); fclose (cfile); - xputenv (concat ("GCC_EXEC_PREFIX=", execpath, NULL)); - xputenv (concat ("COMPILER_PATH=", cpath, NULL)); - xputenv (concat ("LIBRARY_PATH=", lpath, NULL)); - compile_native (gcn_cfile_name, outname, collect_gcc); return 0; -- 2.17.1 --=-=-=--