On 14/07/15 06:54, Jeff Law wrote:
On 07/13/2015 04:58 AM, Tom de Vries wrote:
On 07/07/15 09:53, Tom de Vries wrote:
Hi,
currently, we have these spec strings in gcc/gcc.c involving
ftree-parallelize-loops:
...
%{fopenacc|fopenmp|ftree-parallelize-loops=*:%:include(libgomp.spec)%(link_gomp)}
%{fopenacc|fopenmp|ftree-parallelize-loops=*:-pthread}"
...
Actually, ftree-parallelize-loops={0,1} means that no parallelization is
done, but these spec strings still get activated for these values.
Attached patch fixes that, by introducing a spec function gt (short for
greather than), and using it in the spec lines.
Attached (untested) patch manages the same, without introducing the spec
function 'gt'. But the solution is a bit convoluted, so I prefer the one
with the gt function.
I prefer the one with the gt function :-)
Committed the patch using the gt function, as attached (formatting
fixed, ChangeLog entry added).
Thanks,
- Tom
Ignore -ftree-parallelize-loops={0,1} using gt
2015-07-14 Tom de Vries <t...@codesourcery.com>
* gcc.c (greater_than_spec_func): Declare forward.
(LINK_COMMAND_SPEC, GOMP_SELF_SPECS): Use gt to ignore
-ftree-parallelize-loops={0,1}.
(static_spec_functions): Add greater_than_spec_func function with name
"gt".
(greater_than_spec_func): New function.
---
gcc/gcc.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 47 insertions(+), 2 deletions(-)
diff --git a/gcc/gcc.c b/gcc/gcc.c
index 0f29b78..92d0909 100644
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -274,6 +274,7 @@ static const char *compare_debug_self_opt_spec_function (int, const char **);
static const char *compare_debug_auxbase_opt_spec_function (int, const char **);
static const char *pass_through_libs_spec_func (int, const char **);
static const char *replace_extension_spec_func (int, const char **);
+static const char *greater_than_spec_func (int, const char **);
static char *convert_white_space (char *);
/* The Specs Language
@@ -881,7 +882,8 @@ proper position among the other output files. */
%{s} %{t} %{u*} %{z} %{Z} %{!nostdlib:%{!nostartfiles:%S}} " VTABLE_VERIFICATION_SPEC " \
%{static:} %{L*} %(mfwrap) %(link_libgcc) " SANITIZER_EARLY_SPEC " %o\
" CHKP_SPEC " \
- %{fopenacc|fopenmp|ftree-parallelize-loops=*:%:include(libgomp.spec)%(link_gomp)}\
+ %{fopenacc|fopenmp|%:gt(%{ftree-parallelize-loops=*} 1):\
+ %:include(libgomp.spec)%(link_gomp)}\
%{fcilkplus:%:include(libcilkrts.spec)%(link_cilkrts)}\
%{fgnu-tm:%:include(libitm.spec)%(link_itm)}\
%(mflib) " STACK_SPLIT_SPEC "\
@@ -1042,7 +1044,8 @@ static const char *const multilib_defaults_raw[] = MULTILIB_DEFAULTS;
/* Linking to libgomp implies pthreads. This is particularly important
for targets that use different start files and suchlike. */
#ifndef GOMP_SELF_SPECS
-#define GOMP_SELF_SPECS "%{fopenacc|fopenmp|ftree-parallelize-loops=*: " \
+#define GOMP_SELF_SPECS \
+ "%{fopenacc|fopenmp|%:gt(%{ftree-parallelize-loops=*} 1): " \
"-pthread}"
#endif
@@ -1482,6 +1485,7 @@ static const struct spec_function static_spec_functions[] =
{ "compare-debug-auxbase-opt", compare_debug_auxbase_opt_spec_function },
{ "pass-through-libs", pass_through_libs_spec_func },
{ "replace-extension", replace_extension_spec_func },
+ { "gt", greater_than_spec_func },
#ifdef EXTRA_SPEC_FUNCTIONS
EXTRA_SPEC_FUNCTIONS
#endif
@@ -9428,6 +9432,47 @@ replace_extension_spec_func (int argc, const char **argv)
return result;
}
+/* Returns "" if the n in ARGV[1] == -opt=<n> is greater than ARGV[2].
+ Otherwise, return NULL. */
+
+static const char *
+greater_than_spec_func (int argc, const char **argv)
+{
+ char *converted;
+
+ if (argc == 1)
+ return NULL;
+
+ gcc_assert (argc == 3);
+ gcc_assert (argv[0][0] == '-');
+ gcc_assert (argv[0][1] == '\0');
+
+ /* Point p to <n> in in -opt=<n>. */
+ const char *p = argv[1];
+ while (true)
+ {
+ char c = *p;
+ if (c == '\0')
+ gcc_unreachable ();
+
+ ++p;
+
+ if (c == '=')
+ break;
+ }
+
+ long arg = strtol (p, &converted, 10);
+ gcc_assert (converted != p);
+
+ long lim = strtol (argv[2], &converted, 10);
+ gcc_assert (converted != argv[2]);
+
+ if (arg > lim)
+ return "";
+
+ return NULL;
+}
+
/* Insert backslash before spaces in ORIG (usually a file path), to
avoid being broken by spec parser.
--
1.9.1