Skip to content
Snippets Groups Projects
  1. Jan 03, 2024
  2. Nov 07, 2023
    • Kwok Cheung Yeung's avatar
      openmp: Add support for the 'indirect' clause in C/C++ · a49c7d31
      Kwok Cheung Yeung authored
      This adds support for the 'indirect' clause in the 'declare target'
      directive.  Functions declared as indirect may be called via function
      pointers passed from the host in offloaded code.
      
      Virtual calls to member functions via the object pointer in C++ are
      currently not supported in target regions.
      
      2023-11-07  Kwok Cheung Yeung  <kcy@codesourcery.com>
      
      gcc/c-family/
      	* c-attribs.cc (c_common_attribute_table): Add attribute for
      	indirect functions.
      	* c-pragma.h (enum parma_omp_clause): Add entry for indirect clause.
      
      gcc/c/
      	* c-decl.cc (c_decl_attributes): Add attribute for indirect
      	functions.
      	* c-lang.h (c_omp_declare_target_attr): Add indirect field.
      	* c-parser.cc (c_parser_omp_clause_name): Handle indirect clause.
      	(c_parser_omp_clause_indirect): New.
      	(c_parser_omp_all_clauses): Handle indirect clause.
      	(OMP_DECLARE_TARGET_CLAUSE_MASK): Add indirect clause to mask.
      	(c_parser_omp_declare_target): Handle indirect clause.  Emit error
      	message if device_type or indirect clauses used alone.  Emit error
      	if indirect clause used with device_type that is not 'any'.
      	(OMP_BEGIN_DECLARE_TARGET_CLAUSE_MASK): Add indirect clause to mask.
      	(c_parser_omp_begin): Handle indirect clause.
      	* c-typeck.cc (c_finish_omp_clauses): Handle indirect clause.
      
      gcc/cp/
      	* cp-tree.h (cp_omp_declare_target_attr): Add indirect field.
      	* decl2.cc (cplus_decl_attributes): Add attribute for indirect
      	functions.
      	* parser.cc (cp_parser_omp_clause_name): Handle indirect clause.
      	(cp_parser_omp_clause_indirect): New.
      	(cp_parser_omp_all_clauses): Handle indirect clause.
      	(handle_omp_declare_target_clause): Add extra parameter.  Add
      	indirect attribute for indirect functions.
      	(OMP_DECLARE_TARGET_CLAUSE_MASK): Add indirect clause to mask.
      	(cp_parser_omp_declare_target): Handle indirect clause.  Emit error
      	message if device_type or indirect clauses used alone.  Emit error
      	if indirect clause used with device_type that is not 'any'.
      	(OMP_BEGIN_DECLARE_TARGET_CLAUSE_MASK): Add indirect clause to mask.
      	(cp_parser_omp_begin): Handle indirect clause.
      	* semantics.cc (finish_omp_clauses): Handle indirect clause.
      
      gcc/
      	* lto-cgraph.cc (enum LTO_symtab_tags): Add tag for indirect
      	functions.
      	(output_offload_tables): Write indirect functions.
      	(input_offload_tables): read indirect functions.
      	* lto-section-names.h (OFFLOAD_IND_FUNC_TABLE_SECTION_NAME): New.
      	* omp-builtins.def (BUILT_IN_GOMP_TARGET_MAP_INDIRECT_PTR): New.
      	* omp-offload.cc (offload_ind_funcs): New.
      	(omp_discover_implicit_declare_target): Add functions marked with
      	'omp declare target indirect' to indirect functions list.
      	(omp_finish_file): Add indirect functions to section for offload
      	indirect functions.
      	(execute_omp_device_lower): Redirect indirect calls on target by
      	passing function pointer to BUILT_IN_GOMP_TARGET_MAP_INDIRECT_PTR.
      	(pass_omp_device_lower::gate): Run pass_omp_device_lower if
      	indirect functions are present on an accelerator device.
      	* omp-offload.h (offload_ind_funcs): New.
      	* tree-core.h (omp_clause_code): Add OMP_CLAUSE_INDIRECT.
      	* tree.cc (omp_clause_num_ops): Add entry for OMP_CLAUSE_INDIRECT.
      	(omp_clause_code_name): Likewise.
      	* tree.h (OMP_CLAUSE_INDIRECT_EXPR): New.
      	* config/gcn/mkoffload.cc (process_asm): Process offload_ind_funcs
      	section.  Count number of indirect functions.
      	(process_obj): Emit number of indirect functions.
      	* config/nvptx/mkoffload.cc (ind_func_ids, ind_funcs_tail): New.
      	(process): Emit offload_ind_func_table in PTX code.  Emit indirect
      	function names and count in image.
      	* config/nvptx/nvptx.cc (nvptx_record_offload_symbol): Mark
      	indirect functions in PTX code with IND_FUNC_MAP.
      
      gcc/testsuite/
      	* c-c++-common/gomp/declare-target-7.c: Update expected error message.
      	* c-c++-common/gomp/declare-target-indirect-1.c: New.
      	* c-c++-common/gomp/declare-target-indirect-2.c: New.
      	* g++.dg/gomp/attrs-21.C (v12): Update expected error message.
      	* g++.dg/gomp/declare-target-indirect-1.C: New.
      	* gcc.dg/gomp/attrs-21.c (v12): Update expected error message.
      
      include/
      	* gomp-constants.h (GOMP_VERSION): Increment to 3.
      	(GOMP_VERSION_SUPPORTS_INDIRECT_FUNCS): New.
      
      libgcc/
      	* offloadstuff.c (OFFLOAD_IND_FUNC_TABLE_SECTION_NAME): New.
      	(__offload_ind_func_table): New.
      	(__offload_ind_funcs_end): New.
      	(__OFFLOAD_TABLE__): Add entries for indirect functions.
      
      libgomp/
      	* Makefile.am (libgomp_la_SOURCES): Add target-indirect.c.
      	* Makefile.in: Regenerate.
      	* libgomp-plugin.h (GOMP_INDIRECT_ADDR_MAP): New define.
      	(GOMP_OFFLOAD_load_image): Add extra argument.
      	* libgomp.h (struct indirect_splay_tree_key_s): New.
      	(indirect_splay_tree_node, indirect_splay_tree,
      	indirect_splay_tree_key): New.
      	(indirect_splay_compare): New.
      	* libgomp.map (GOMP_5.1.1): Add GOMP_target_map_indirect_ptr.
      	* libgomp.texi (OpenMP 5.1): Update documentation on indirect
      	calls in target region and on indirect clause.
      	(Other new OpenMP 5.2 features): Add entry for virtual function calls.
      	* libgomp_g.h (GOMP_target_map_indirect_ptr): Add prototype.
      	* oacc-host.c (host_load_image): Add extra argument.
      	* target.c (gomp_load_image_to_device): If the GOMP_VERSION is high
      	enough, read host indirect functions table and pass to
      	load_image_func.
      	* config/accel/target-indirect.c: New.
      	* config/linux/target-indirect.c: New.
      	* config/gcn/team.c (build_indirect_map): Add prototype.
      	(gomp_gcn_enter_kernel): Initialize support for indirect
      	function calls on GCN target.
      	* config/nvptx/team.c (build_indirect_map): Add prototype.
      	(gomp_nvptx_main): Initialize support for indirect function
      	calls on NVPTX target.
      	* plugin/plugin-gcn.c (struct gcn_image_desc): Add field for
      	indirect functions count.
      	(GOMP_OFFLOAD_load_image): Add extra argument.  If the GOMP_VERSION
      	is high enough, build address translation table and copy it to target
      	memory.
      	* plugin/plugin-nvptx.c (nvptx_tdata): Add field for indirect
      	functions count.
      	(GOMP_OFFLOAD_load_image): Add extra argument.  If the GOMP_VERSION
      	is high enough, Build address translation table and copy it to target
      	memory.
      	* testsuite/libgomp.c-c++-common/declare-target-indirect-1.c: New.
      	* testsuite/libgomp.c-c++-common/declare-target-indirect-2.c: New.
      	* testsuite/libgomp.c++/declare-target-indirect-1.C: New.
      a49c7d31
  3. Jan 16, 2023
  4. Jan 03, 2022
  5. Jan 04, 2021
  6. Jan 01, 2020
  7. Jan 01, 2019
  8. Jan 03, 2018
  9. Jan 01, 2017
  10. Feb 25, 2016
    • Ilya Verbin's avatar
      re PR driver/68463 (Offloading fails when some objects are compiled with LTO and some without) · e6861a99
      Ilya Verbin authored
      gcc/
      	PR driver/68463
      	* config/gnu-user.h (CRTOFFLOADBEGIN): Define.  Add crtoffloadbegin.o if
      	offloading is enabled and -fopenacc or -fopenmp is specified.
      	(CRTOFFLOADEND): Likewise.
      	(GNU_USER_TARGET_STARTFILE_SPEC): Add CRTOFFLOADBEGIN.
      	(GNU_USER_TARGET_ENDFILE_SPEC): Add CRTOFFLOADEND.
      	* lto-wrapper.c (offloadbegin, offloadend): Remove static vars.
      	(offload_objects_file_name): New static var.
      	(tool_cleanup): Remove offload_objects_file_name file.
      	(find_offloadbeginend): Replace with ...
      	(find_crtoffloadtable): ... this.
      	(run_gcc): Remove offload_argc and offload_argv.
      	Get offload_objects_file_name from -foffload-objects=... option.
      	Read names of object files with offload from this file, pass them to
      	compile_images_for_offload_targets.  Don't call find_offloadbeginend and
      	don't pass offloadbegin and offloadend to the linker.  Don't pass
      	offload non-LTO files to the linker, because now they're not claimed.
      libgcc/
      	PR driver/68463
      	* Makefile.in (crtoffloadtable$(objext)): New rule.
      	* configure.ac (extra_parts): Add crtoffloadtable$(objext) if
      	enable_offload_targets is not empty.
      	* configure: Regenerate.
      	* offloadstuff.c: Move __OFFLOAD_TABLE__ from crtoffloadend to
      	crtoffloadtable.
      libgomp/
      	PR driver/68463
      	* testsuite/libgomp.oacc-c-c++-common/parallel-dims-2.c: Remove.
      lto-plugin/
      	PR driver/68463
      	* lto-plugin.c (struct plugin_offload_file): New.
      	(offload_files): Change type.
      	(offload_files_last, offload_files_last_obj): New.
      	(offload_files_last_lto): New.
      	(free_2): Adjust accordingly.
      	(all_symbols_read_handler): Don't add offload files to lto_arg_ptr.
      	Don't call free_1 for offload_files.  Write names of object files with
      	offloading to the temporary file.  Add new option to lto_arg_ptr.
      	(claim_file_handler): Don't claim file if it contains offload sections
      	without LTO sections.  If it contains offload sections, add to the list.
      
      From-SVN: r233712
      e6861a99
  11. Jan 04, 2016
  12. Jul 17, 2015
    • Nathan Sidwell's avatar
      mkoffload.c (process): Constify host data. · ebe4a560
      Nathan Sidwell authored
      	gcc/
      	* config/nvptx/mkoffload.c (process): Constify host data.
      	* config/i386/intelmic-mkoffload.c (generate_target_descr_file):
      	Constify host data.
      	(generate_host_descr_file): Likewise.
      
      	libgomp/
      	* target.c (struct_offload_image_descr): Constify host_table.
      	(gomp_offload_image_to_device): Likewise.
      	(GOMP_offload_register, GOMP_offload_unregister): Likewise.
      
      	libgcc/
      	* offloadstuff.c: Constify host data.
      
      From-SVN: r225943
      ebe4a560
  13. Jan 05, 2015
  14. Nov 13, 2014
    • Bernd Schmidt's avatar
      [PATCH 1/7] OpenMP 4.0 offloading infrastructure: configure and make · 85c64bbe
      Bernd Schmidt authored
      
      	* configure: Regenerate.
      	* configure.ac (--enable-as-accelerator-for)
      	(--enable-offload-targets): New configure options.
      gcc/
      	* Makefile.in (real_target_noncanonical, accel_dir_suffix)
      	(enable_as_accelerator): New variables substituted by configure.
      	(libsubdir, libexecsubdir, unlibsubdir): Tweak for the possibility of
      	being configured as an offload compiler.
      	(DRIVER_DEFINES): Pass new defines DEFAULT_REAL_TARGET_MACHINE and
      	ACCEL_DIR_SUFFIX.
      	(install-cpp, install-common, install_driver, install-gcc-ar): Do not
      	install for the offload compiler.
      	* config.in: Regenerate.
      	* configure: Regenerate.
      	* configure.ac (real_target_noncanonical, accel_dir_suffix)
      	(enable_as_accelerator): Compute new variables.
      	(ACCEL_COMPILER): Define if the compiler is built as the accel compiler.
      	(OFFLOAD_TARGETS): List of target names suitable for offloading.
      	(ENABLE_OFFLOADING): Define if list of offload targets is not empty.
      gcc/cp/
      	* Make-lang.in (c++.install-common): Do not install for the offload
      	compiler.
      gcc/doc/
      	* install.texi (Options specification): Document
      	--enable-as-accelerator-for and --enable-offload-targets.
      gcc/fortran/
      	* Make-lang.in (fortran.install-common): Do not install for the offload
      	compiler.
      libgcc/
      	* Makefile.in (crtoffloadbegin$(objext)): New rule.
      	(crtoffloadend$(objext)): Likewise.
      	* configure: Regenerate.
      	* configure.ac (accel_dir_suffix): Compute new variable.
      	(extra_parts): Add crtoffloadbegin.o and crtoffloadend.o
      	if enable_offload_targets is not empty.
      	* offloadstuff.c: New file.
      libgomp/
      	* config.h.in: Regenerate.
      	* configure: Regenerate.
      	* configure.ac: Check for libdl, required for plugin support.
      	(PLUGIN_SUPPORT): Define if plugins are supported.
      	(enable_offload_targets): Support Intel MIC targets.
      	(OFFLOAD_TARGETS): List of target names suitable for offloading.
      lto-plugin/
      	* Makefile.am (libexecsubdir): Tweak for the possibility of being
      	configured for offload compiler.
      	(accel_dir_suffix, real_target_noncanonical): New variables substituted
      	by configure.
      	* Makefile.in: Regenerate.
      	* configure: Regenerate.
      	* configure.ac (accel_dir_suffix, real_target_noncanonical): Compute new
      	variables.
      
      
      Co-Authored-By: default avatarAndrey Turetskiy <andrey.turetskiy@intel.com>
      Co-Authored-By: default avatarIlya Verbin <ilya.verbin@intel.com>
      Co-Authored-By: default avatarThomas Schwinge <thomas@codesourcery.com>
      
      From-SVN: r217485
      85c64bbe
Loading