This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH 4/4] OpenMP 4.0 offloading to Intel MIC: non-fallback testing
- From: Ilya Verbin <iverbin at gmail dot com>
- To: Jakub Jelinek <jakub at redhat dot com>
- Cc: Thomas Schwinge <thomas at codesourcery dot com>, Kirill Yukhin <kirill dot yukhin at gmail dot com>, gcc-patches at gcc dot gnu dot org
- Date: Mon, 2 Feb 2015 17:03:12 +0300
- Subject: Re: [PATCH 4/4] OpenMP 4.0 offloading to Intel MIC: non-fallback testing
- Authentication-results: sourceware.org; auth=none
- References: <20141030114001 dot GA34120 at msticlxl57 dot ims dot intel dot com> <87tx0t0yh5 dot fsf at kepler dot schwinge dot homeip dot net> <CADG=Z0GWtqLOLNdv3YbP-6jfagd68TKrXSjn27nrwi6YPQkFuQ at mail dot gmail dot com> <87oaqvzz0n dot fsf at kepler dot schwinge dot homeip dot net> <20141222123553 dot GK1667 at tucnak dot redhat dot com> <20150115185540 dot GD5706 at msticlxl57 dot ims dot intel dot com> <20150115185846 dot GJ1405 at tucnak dot redhat dot com> <20150128160259 dot GA12176 at msticlxl57 dot ims dot intel dot com> <20150128161525 dot GV1746 at tucnak dot redhat dot com> <20150128162030 dot GB12176 at msticlxl57 dot ims dot intel dot com>
On 28 Jan 19:20, Ilya Verbin wrote:
> On 28 Jan 17:15, Jakub Jelinek wrote:
> > On Wed, Jan 28, 2015 at 07:02:59PM +0300, Ilya Verbin wrote:
> > > + = XNEWVEC (char, len + sizeof ("-B" "../" DEFAULT_TARGET_MACHINE
> > > + "/libgomp/"));
> > > + sprintf (optional_target_path2, "-B%s/../../../" DEFAULT_TARGET_MACHINE
> > > + "/libgomp/", current_path);
> >
> > This will surely overflow the buffer, won't it? There is space just for
> > "../" but you put there "/../../../".
> >
> > I'd strongly prefer if you rewrote all these XNEWVEC or XRESIZEVEC etc.
> > + sprintf cases into concat, like
> > optional_target_path2 = concat ("-B", current_path,
> > "/../../../" DEFAULT_TARGET_MACHINE
> > "/libgomp/", NULL);
> > and similar. That way you avoid all such bugs.
>
> The variable 'len' contains sizeof ("/../../").
> I agree that this code looks ugly :) I'll rewrite it using concat.
Here is the patch with concat.
diff --git a/gcc/config.gcc b/gcc/config.gcc
index abd915e..0ebdbd2 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -4374,7 +4374,7 @@ fi
case ${target} in
i[34567]86-*-* | x86_64-*-*)
if test x$enable_as_accelerator = xyes; then
- extra_programs="mkoffload\$(exeext)"
+ extra_programs="mkoffload\$(exeext) accel/${target_noncanonical}/mkoffload$(exeext)"
fi
;;
esac
diff --git a/gcc/config/i386/intelmic-mkoffload.c b/gcc/config/i386/intelmic-mkoffload.c
index edc3f92e..bc71004 100644
--- a/gcc/config/i386/intelmic-mkoffload.c
+++ b/gcc/config/i386/intelmic-mkoffload.c
@@ -22,13 +22,13 @@
#include "config.h"
#include <libgen.h>
-#include "libgomp-plugin.h"
#include "system.h"
#include "coretypes.h"
#include "obstack.h"
#include "intl.h"
#include "diagnostic.h"
#include "collect-utils.h"
+#include "intelmic-offload.h"
const char tool_name[] = "intelmic mkoffload";
@@ -45,6 +45,13 @@ const char *temp_files[MAX_NUM_TEMPS];
/* Shows if we should compile binaries for i386 instead of x86-64. */
bool target_ilp32 = false;
+/* Optional prefixes for the target compiler, which are required when target
+ compiler is not installed. */
+char *optional_target_path1 = NULL;
+char *optional_target_path2 = NULL;
+char *optional_target_lib_path = NULL;
+
+
/* Delete tempfiles and exit function. */
void
tool_cleanup (bool from_signal ATTRIBUTE_UNUSED)
@@ -151,14 +158,17 @@ access_check (const char *name, int mode)
return access (name, mode);
}
-/* Find target compiler using a path from COLLECT_GCC or COMPILER_PATH. */
+/* Find target compiler using a path from COLLECT_GCC, COMPILER_PATH, or a path
+ relative to ARGV0. */
static char *
-find_target_compiler (const char *name)
+find_target_compiler (const char *argv0)
{
bool found = false;
char **paths = NULL;
unsigned n_paths, i;
+ const char *current_path;
const char *collect_path = dirname (ASTRDUP (getenv ("COLLECT_GCC")));
+ const char *name = GCC_INSTALL_NAME;
size_t len = strlen (collect_path) + 1 + strlen (name) + 1;
char *target_compiler = XNEWVEC (char, len);
sprintf (target_compiler, "%s/%s", collect_path, name);
@@ -177,13 +187,32 @@ find_target_compiler (const char *name)
if (access_check (target_compiler, X_OK) == 0)
{
found = true;
- break;
+ goto out;
}
}
+ XDELETEVEC (target_compiler);
+
+ /* If installed compiler wasn't found, try to find a non-installed compiler,
+ using a path relative to mkoffload. */
+ current_path = dirname (ASTRDUP (argv0));
+ target_compiler = concat (current_path, "/../../xgcc", NULL);
+ if (access_check (target_compiler, X_OK) == 0)
+ {
+ optional_target_path1 = concat ("-B", current_path, "/../../", NULL);
+ optional_target_path2
+ = concat ("-B", current_path,
+ "/../../../" DEFAULT_TARGET_MACHINE "/libgomp/", NULL);
+ optional_target_lib_path
+ = concat ("-L", current_path,
+ "/../../../" DEFAULT_TARGET_MACHINE "/libgomp/.libs/", NULL);
+ found = true;
+ }
out:
free_array_of_ptrs ((void **) paths, n_paths);
- return found ? target_compiler : NULL;
+ if (!found)
+ fatal_error ("offload compiler %s not found", name);
+ return target_compiler;
}
static void
@@ -193,6 +222,14 @@ compile_for_target (struct obstack *argv_obstack)
obstack_ptr_grow (argv_obstack, "-m32");
else
obstack_ptr_grow (argv_obstack, "-m64");
+
+ if (optional_target_path1)
+ obstack_ptr_grow (argv_obstack, optional_target_path1);
+ if (optional_target_path2)
+ obstack_ptr_grow (argv_obstack, optional_target_path2);
+ if (optional_target_lib_path)
+ obstack_ptr_grow (argv_obstack, optional_target_lib_path);
+
obstack_ptr_grow (argv_obstack, NULL);
char **argv = XOBFINISH (argv_obstack, char **);
@@ -346,7 +383,7 @@ generate_host_descr_file (const char *host_compiler)
"init (void)\n"
"{\n"
" GOMP_offload_register (&__OFFLOAD_TABLE__, %d, __offload_target_data);\n"
- "}\n", OFFLOAD_TARGET_TYPE_INTEL_MIC);
+ "}\n", GOMP_DEVICE_INTEL_MIC);
fclose (src_file);
unsigned new_argc = 0;
@@ -483,11 +520,7 @@ main (int argc, char **argv)
if (!host_compiler)
fatal_error ("COLLECT_GCC must be set");
- const char *target_driver_name
- = DEFAULT_REAL_TARGET_MACHINE "-accel-" DEFAULT_TARGET_MACHINE "-gcc";
- char *target_compiler = find_target_compiler (target_driver_name);
- if (target_compiler == NULL)
- fatal_error ("offload compiler %s not found", target_driver_name);
+ char *target_compiler = find_target_compiler (argv[0]);
/* We may be called with all the arguments stored in some file and
passed with @file. Expand them into argv before processing. */
diff --git a/gcc/config/i386/t-intelmic b/gcc/config/i386/t-intelmic
index 8b36e0d..86e10eb 100644
--- a/gcc/config/i386/t-intelmic
+++ b/gcc/config/i386/t-intelmic
@@ -1,9 +1,16 @@
+CFLAGS-mkoffload.o += $(DRIVER_DEFINES) \
+ -DGCC_INSTALL_NAME=\"$(GCC_INSTALL_NAME)\"
+
mkoffload.o: $(srcdir)/config/i386/intelmic-mkoffload.c | insn-modes.h
- $(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
- -I$(srcdir)/../libgomp \
- -DDEFAULT_REAL_TARGET_MACHINE=\"$(real_target_noncanonical)\" \
- -DDEFAULT_TARGET_MACHINE=\"$(target_noncanonical)\" \
- $< $(OUTPUT_OPTION)
+ $(COMPILE) $<
+ $(POSTCOMPILE)
mkoffload$(exeext): mkoffload.o collect-utils.o libcommon-target.a $(LIBIBERTY) $(LIBDEPS)
- $(COMPILER) -o $@ mkoffload.o collect-utils.o libcommon-target.a $(LIBIBERTY) $(LIBS)
+ $(LINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \
+ mkoffload.o collect-utils.o libcommon-target.a $(LIBIBERTY) $(LIBS)
+
+accel/$(target_noncanonical)/mkoffload$(exeext): mkoffload$(exeext)
+ test -d accel || mkdir accel
+ test -d accel/$(target_noncanonical) || mkdir accel/$(target_noncanonical)
+ rm -f $@
+ $(LN) mkoffload$(exeext) $@
diff --git a/libgomp/configure b/libgomp/configure
index 0818707..8d96950 100755
--- a/libgomp/configure
+++ b/libgomp/configure
@@ -15226,6 +15226,9 @@ if test x"$enable_offload_targets" != x; then
case $tgt in
*-intelmic-* | *-intelmicemul-*)
tgt_name=intelmic
+ if test x"$tgt_dir" != x; then
+ offload_additional_lib_paths="$offload_additional_lib_paths:$tgt_dir/$tgt/liboffloadmic/.libs"
+ fi
;;
nvptx*)
tgt_name=nvptx
@@ -15276,7 +15279,7 @@ rm -f core conftest.err conftest.$ac_objext \
offload_targets=$offload_targets,$tgt_name
fi
if test x"$tgt_dir" != x; then
- offload_additional_options="$offload_additional_options -B$tgt_dir/libexec/gcc/\$(target_alias)/\$(gcc_version) -B$tgt_dir/bin"
+ offload_additional_options="$offload_additional_options -B$tgt_dir/libexec/gcc/\$(target_alias)/\$(gcc_version) -B$tgt_dir/gcc -B$tgt_dir/bin"
offload_additional_lib_paths="$offload_additional_lib_paths:$tgt_dir/lib64:$tgt_dir/lib:$tgt_dir/lib32"
else
offload_additional_options="$offload_additional_options -B\$(libexecdir)/gcc/\$(target_alias)/\$(gcc_version) -B\$(bindir)"
diff --git a/libgomp/plugin/configfrag.ac b/libgomp/plugin/configfrag.ac
index 254c688..2861e68 100644
--- a/libgomp/plugin/configfrag.ac
+++ b/libgomp/plugin/configfrag.ac
@@ -94,6 +94,9 @@ if test x"$enable_offload_targets" != x; then
case $tgt in
*-intelmic-* | *-intelmicemul-*)
tgt_name=intelmic
+ if test x"$tgt_dir" != x; then
+ offload_additional_lib_paths="$offload_additional_lib_paths:$tgt_dir/$tgt/liboffloadmic/.libs"
+ fi
;;
nvptx*)
tgt_name=nvptx
@@ -133,7 +136,7 @@ if test x"$enable_offload_targets" != x; then
offload_targets=$offload_targets,$tgt_name
fi
if test x"$tgt_dir" != x; then
- offload_additional_options="$offload_additional_options -B$tgt_dir/libexec/gcc/\$(target_alias)/\$(gcc_version) -B$tgt_dir/bin"
+ offload_additional_options="$offload_additional_options -B$tgt_dir/libexec/gcc/\$(target_alias)/\$(gcc_version) -B$tgt_dir/gcc -B$tgt_dir/bin"
offload_additional_lib_paths="$offload_additional_lib_paths:$tgt_dir/lib64:$tgt_dir/lib:$tgt_dir/lib32"
else
offload_additional_options="$offload_additional_options -B\$(libexecdir)/gcc/\$(target_alias)/\$(gcc_version) -B\$(bindir)"
-- Ilya