Skip to content
Snippets Groups Projects
  • Kwok Cheung Yeung's avatar
    a49c7d31
    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
    History
    openmp: Add support for the 'indirect' clause in C/C++
    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.