From 2efe32ecae33853d281ff1b753939838ed9fe0f7 Mon Sep 17 00:00:00 2001 From: Bob Dubner <rdubner@symas.com> Date: Mon, 1 Jan 2024 11:38:31 -0500 Subject: [PATCH] We have ignition on generalized RETURNING --- gcc/cobol/genapi.cc | 10 +++++++--- gcc/cobol/gengen.cc | 16 ++++++++++++---- gcc/cobol/gengen.h | 1 + 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/gcc/cobol/genapi.cc b/gcc/cobol/genapi.cc index cfe62b579d6f..a65b0d1a6ea6 100644 --- a/gcc/cobol/genapi.cc +++ b/gcc/cobol/genapi.cc @@ -717,7 +717,7 @@ function_handle_from_name(cbl_refer_t &name, tree unmangled_name = gg_define_char_star(); tree mangled_name = gg_define_char_star(); - gg_assign(unmangled_name, gg_call_expr( CHAR_P, + gg_assign(unmangled_name, gg_call_expr( CHAR_P, "__gg__name_not_mangled", 1, gg_get_address_of(name.refer_decl_node))); @@ -835,7 +835,7 @@ function_handle_from_name(cbl_refer_t &name, // If it's a literal, call the target literally using the // undecorated name. At END-PROGRAM, the parser will replace // in-scope plain names with mangled names. - if( use_static_call() && is_literal(name.field) ) + if( use_static_call() && is_literal(name.field) ) { // A literal name is always "found". We create a reference to // it, which is later resolved by the linker. @@ -4891,6 +4891,10 @@ parser_exit(void) tree return_type = tree_type_from_field_type(current_function->returning, nbytes); tree retval = gg_define_variable(return_type); + + gg_modify_function_type(current_function->function_decl, + return_type); + if( is_numeric( field_type ) ) { // The field being returned is numeric. @@ -4918,7 +4922,6 @@ parser_exit(void) gg_get_address_of(value), build_int_cst_type(SIZE_T, nbytes)); } - gg_return(retval); } else @@ -10516,6 +10519,7 @@ parser_call( cbl_refer_t name, size_t nbytes; tree returned_value_type = tree_type_from_field_type(returned.field, nbytes); + if(returned.field) { // we were given a returned::field, so find its location and length: diff --git a/gcc/cobol/gengen.cc b/gcc/cobol/gengen.cc index 0f7b0ed739eb..9c779326d757 100644 --- a/gcc/cobol/gengen.cc +++ b/gcc/cobol/gengen.cc @@ -632,10 +632,6 @@ gg_start_building_a_union(const char *type_name, tree type_context) return typedecl; } - - - - static tree gg_start_building_a_struct(const char *type_name, tree type_context) { @@ -2629,6 +2625,18 @@ chain_parameter_to_function(tree function_decl, const tree param_type, const ch } } +void +gg_modify_function_type(tree function_decl, tree return_type) + { + tree fndecl_type = build_varargs_function_type_array( return_type, + 0, // No parameters yet + NULL); // And, hence, no types + TREE_TYPE(function_decl) = fndecl_type; + tree resdecl = build_decl (UNKNOWN_LOCATION, RESULT_DECL, NULL_TREE, return_type); + DECL_CONTEXT (resdecl) = function_decl; + DECL_RESULT (function_decl) = resdecl; + } + tree gg_define_function_with_no_parameters(tree return_type, const char *funcname, diff --git a/gcc/cobol/gengen.h b/gcc/cobol/gengen.h index a11ffcbd0e5b..9ef5dfad6378 100644 --- a/gcc/cobol/gengen.h +++ b/gcc/cobol/gengen.h @@ -541,4 +541,5 @@ tree gg_open(tree char_star_A, tree int_B); tree gg_close(tree int_A); tree gg_get_indirect_reference(tree pointer, tree offset); void gg_insert_into_assembler(const char *format, ...); +void gg_modify_function_type(tree function_decl, tree return_type); #endif -- GitLab