/* Flags for extensions that end up being streamed. */
enum streamed_extensions {
- SE_OPENMP = 1 << 0,
- SE_BITS = 1
+ SE_OPENMP_SIMD = 1 << 0,
+ SE_OPENMP = 1 << 1,
+ SE_OPENACC = 1 << 2,
+ SE_BITS = 3
};
/* Counter indices. */
return res;
}
+
+#define CASE_OMP_SIMD_CODE \
+ case OMP_SIMD: \
+ case OMP_STRUCTURED_BLOCK: \
+ case OMP_LOOP: \
+ case OMP_ORDERED: \
+ case OMP_TILE: \
+ case OMP_UNROLL
+#define CASE_OMP_CODE \
+ case OMP_PARALLEL: \
+ case OMP_TASK: \
+ case OMP_FOR: \
+ case OMP_DISTRIBUTE: \
+ case OMP_TASKLOOP: \
+ case OMP_TEAMS: \
+ case OMP_TARGET_DATA: \
+ case OMP_TARGET: \
+ case OMP_SECTIONS: \
+ case OMP_CRITICAL: \
+ case OMP_SINGLE: \
+ case OMP_SCOPE: \
+ case OMP_TASKGROUP: \
+ case OMP_MASKED: \
+ case OMP_DISPATCH: \
+ case OMP_INTEROP: \
+ case OMP_MASTER: \
+ case OMP_TARGET_UPDATE: \
+ case OMP_TARGET_ENTER_DATA: \
+ case OMP_TARGET_EXIT_DATA: \
+ case OMP_METADIRECTIVE: \
+ case OMP_ATOMIC: \
+ case OMP_ATOMIC_READ: \
+ case OMP_ATOMIC_CAPTURE_OLD: \
+ case OMP_ATOMIC_CAPTURE_NEW
+#define CASE_OACC_CODE \
+ case OACC_PARALLEL: \
+ case OACC_KERNELS: \
+ case OACC_SERIAL: \
+ case OACC_DATA: \
+ case OACC_HOST_DATA: \
+ case OACC_LOOP: \
+ case OACC_CACHE: \
+ case OACC_DECLARE: \
+ case OACC_ENTER_DATA: \
+ case OACC_EXIT_DATA: \
+ case OACC_UPDATE
+
/* Start tree write. Write information to allocate the receiving
node. */
break;
case OMP_CLAUSE:
- state->extensions |= SE_OPENMP;
u (OMP_CLAUSE_CODE (t));
break;
+ CASE_OMP_SIMD_CODE:
+ state->extensions |= SE_OPENMP_SIMD;
+ break;
+
+ CASE_OMP_CODE:
+ state->extensions |= SE_OPENMP;
+ break;
+
+ CASE_OACC_CODE:
+ state->extensions |= SE_OPENACC;
+ break;
+
case STRING_CST:
str (TREE_STRING_POINTER (t), TREE_STRING_LENGTH (t));
break;
break;
case OMP_CLAUSE:
- {
- if (!(state->extensions & SE_OPENMP))
- goto fail;
+ t = build_omp_clause (UNKNOWN_LOCATION, omp_clause_code (u ()));
+ break;
- unsigned omp_code = u ();
- t = build_omp_clause (UNKNOWN_LOCATION, omp_clause_code (omp_code));
- }
+ CASE_OMP_SIMD_CODE:
+ if (!(state->extensions & SE_OPENMP_SIMD))
+ goto fail;
+ t = make_node (tree_code (code));
+ break;
+
+ CASE_OMP_CODE:
+ if (!(state->extensions & SE_OPENMP))
+ goto fail;
+ t = make_node (tree_code (code));
+ break;
+
+ CASE_OACC_CODE:
+ if (!(state->extensions & SE_OPENACC))
+ goto fail;
+ t = make_node (tree_code (code));
break;
case STRING_CST:
readme.printf ("source: %s", main_input_filename);
readme.printf ("dialect: %s", dialect);
if (extensions)
- readme.printf ("extensions: %s",
- extensions & SE_OPENMP ? "-fopenmp" : "");
+ readme.printf ("extensions: %s%s%s",
+ extensions & SE_OPENMP ? "-fopenmp"
+ : extensions & SE_OPENMP_SIMD ? "-fopenmp-simd" : "",
+ (extensions & SE_OPENACC)
+ && (extensions & (SE_OPENMP | SE_OPENMP_SIMD))
+ ? " " : "",
+ extensions & SE_OPENACC ? "-fopenacc" : "");
/* The following fields could be expected to change between
otherwise identical compilations. Consider a distributed build
too. */
{
unsigned ext = cfg.u ();
- unsigned allowed = (flag_openmp ? SE_OPENMP : 0);
+ unsigned allowed = (flag_openmp ? SE_OPENMP | SE_OPENMP_SIMD : 0);
+ if (flag_openmp_simd)
+ allowed |= SE_OPENMP_SIMD;
+ if (flag_openacc)
+ allowed |= SE_OPENACC;
if (unsigned bad = ext & ~allowed)
{
if (bad & SE_OPENMP)
error_at (loc, "module contains OpenMP, use %<-fopenmp%> to enable");
+ else if (bad & SE_OPENMP_SIMD)
+ error_at (loc, "module contains OpenMP, use %<-fopenmp%> or "
+ "%<-fopenmp-simd%> to enable");
+ if (bad & SE_OPENACC)
+ error_at (loc, "module contains OpenACC, use %<-fopenacc%> to "
+ "enable");
cfg.set_overrun ();
goto done;
}