On Tue, May 05, 2015 at 10:57:28AM +0200, Thomas Schwinge wrote: > --- gcc/c-family/c-common.c > +++ gcc/c-family/c-common.c > @@ -809,7 +809,7 @@ const struct attribute_spec c_common_attribute_table[] = > handle_omp_declare_simd_attribute, false }, > { "cilk simd function", 0, -1, true, false, false, > handle_omp_declare_simd_attribute, false }, > - { "omp declare target", 0, 0, true, false, false, > + { "omp declare target", 0, -1, true, false, false, > handle_omp_declare_target_attribute, false }, > { "alloc_align", 1, 1, false, true, true, > handle_alloc_align_attribute, false },
Can you explain this change? "omp declare target" doesn't take any arguments, so "0, 0," looks right to me. > @@ -823,6 +823,7 @@ const struct attribute_spec c_common_attribute_table[] = > handle_bnd_legacy, false }, > { "bnd_instrument", 0, 0, true, false, false, > handle_bnd_instrument, false }, > + { "oacc declare", 0, -1, true, false, false, NULL, false }, > { NULL, 0, 0, false, false, false, NULL, false } If "oacc declare" is different, then supposedly you shouldn't reuse "omp declare target" attribute for the OpenACC thingie. > --- gcc/c-family/c-omp.c > +++ gcc/c-family/c-omp.c > @@ -1087,3 +1087,108 @@ c_omp_predetermined_sharing (tree decl) > > return OMP_CLAUSE_DEFAULT_UNSPECIFIED; > } > + > +/* Return a numerical code representing the device_type. Currently, > + only device_type(nvidia) is supported. All device_type parameters > + are treated as case-insensitive keywords. */ > + > +int > +oacc_extract_device_id (const char *device) > +{ > + if (!strcasecmp (device, "nvidia")) > + return GOMP_DEVICE_NVIDIA_PTX; > + return GOMP_DEVICE_NONE; > +} Why do you support just one particular device_type? That sounds broken. You should just have some table with names <-> GOMP_DEVICE_* mappings. > + if (code & (1 << GOMP_DEVICE_NVIDIA_PTX)) > + { > + if (seen_nvidia) > + { > + seen_nvidia = NULL_TREE; > + error_at (OMP_CLAUSE_LOCATION (c), > + "duplicate device_type (nvidia)"); > + goto filter_error; > + } > + else > + seen_nvidia = OMP_CLAUSE_DEVICE_TYPE_CLAUSES (c); Again, I must say I don't like the hardcoding of one particular device type here. Doesn't Intel want to support OpenACC for XeonPhi? What about HSA eventually, etc.? > @@ -4624,7 +4657,7 @@ c_parser_compound_statement_nostart (c_parser *parser) > last_label = false; > mark_valid_location_for_stdc_pragma (false); > c_parser_declaration_or_fndef (parser, true, true, true, true, > - true, NULL, vNULL); > + true, NULL, vNULL, NULL_TREE, false); Wouldn't default arguments be in order here? Though, even those will mean compile time cost of passing all the zeros almost all the time. > -/* OpenMP 2.5: > +/* OpenACC: > + num_gangs ( expression ) > + num_workers ( expression ) > + vector_length ( expression ) > + > + OpenMP 2.5: > num_threads ( expression ) */ > > static tree > -c_parser_omp_clause_num_threads (c_parser *parser, tree list) > +c_parser_omp_positive_int_clause (c_parser *parser, pragma_omp_clause c_kind, > + const char *str, tree list) > { > - location_t num_threads_loc = c_parser_peek_token (parser)->location; > - if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) > + omp_clause_code kind; > + switch (c_kind) This is undesirable, to add new clauses to the same handler you'd need to add them both in the caller and to this switch. Perhaps pass omp_clause_code kind argument instead of pragma_omp_clause c_kind? > static tree > -c_parser_omp_clause_num_workers (c_parser *parser, tree list) > +c_parser_oacc_shape_clause (c_parser *parser, pragma_omp_clause c_kind, > + const char *str, tree list) > { > - location_t num_workers_loc = c_parser_peek_token (parser)->location; > - if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) > + omp_clause_code kind; > + const char *id = "num"; > + > + switch (c_kind) Likewise. > +/* Split the 'clauses' into a set of 'loop' clauses and a set of > + 'not-loop' clauses. */ > > static tree > -c_parser_oacc_kernels (location_t loc, c_parser *parser, char *p_name) > +oacc_split_loop_clauses (tree clauses, tree *not_loop_clauses) Is this really C specific? I mean, for OpenMP I'm sharing the clause splitting code between C and C++ FEs in c-omp.c. Jakub