Nah, I see ECF_TM_PURE despite the name seems to be doing something very
different than ECF_CONST and ECF_PURE:

  if (flags & ECF_PURE)
    DECL_PURE_P (decl) = 1;
  ...
  if ((flags & ECF_TM_PURE) && flag_tm)
    apply_tm_attr (decl, get_identifier ("transaction_pure"));

Still, you may try to use the same ECF attributes than gcc/builtins.def..

> Perhaps it is because you are using ECF_TM_PURE when defining the
> built-in in cobol1.cc:
>
>   #define ATTR_TMPURE_NORETURN_NOTHROW_LEAF_COLD_LIST 
> (ECF_TM_PURE|ECF_NORETURN|ECF_NOTHROW|ECF_LEAF|ECF_COLD)
>
>   [...]
>   gfc_define_builtin ("__builtin_exit", ftype, BUILT_IN_EXIT,
>           "exit", ATTR_TMPURE_NORETURN_NOTHROW_LEAF_COLD_LIST);
>
> In gcc/builtins.def:
>
>   DEF_LIB_BUILTIN        (BUILT_IN_EXIT, "exit", BT_FN_VOID_INT, 
> ATTR_NORETURN_NOTHROW_LIST)
>
> So you want ECF_NORETURN and ECF_NOTHROW.
>
>> I stated that poorly.  After I generate the GENERIC, and I hand the tree
>> over to the middle end, it is the call to BUILT_IN_EXIT that seems to be
>> disappearing.
>>
>> Everything I describe here is occurring with a -O0 build of GCC and
>> GCOBOL.
>>
>>> -----Original Message-----
>>> From: Robert Dubner <rdub...@symas.com>
>>> Sent: Thursday, April 3, 2025 18:16
>>> To: 'GCC Mailing List' <gcc@gcc.gnu.org>
>>> Cc: Robert Dubner <rdub...@symas.com>
>>> Subject: COBOL: Call to builtin_decl_explicit (BUILT_IN_EXIT), is
>>> optimized away.
>>> 
>>> The COBOL compiler has this routine:
>>> 
>>> void
>>> gg_exit(tree exit_code)
>>>   {
>>>   tree the_call =
>>>       build_call_expr_loc(location_from_lineno(),
>>>                           builtin_decl_explicit (BUILT_IN_EXIT),
>>>                           1,
>>>                           exit_code);
>>>   gg_append_statement(the_call);
>>>   }
>>> 
>>> I have found that when GCOBOL is used with -O2, -O3, or -Os, the call to
>>> gg_exit() is optimized away, and the intended exit value is lost, and I
>>> end up with zero.
>>> 
>>> By changing the routine to
>>> 
>>> void
>>> gg_exit(tree exit_code)
>>>   {
>>>   tree args[1] = {exit_code};
>>>   tree function = gg_get_function_address(INT, "exit");
>>>   tree the_call = build_call_array_loc (location_from_lineno(),
>>>                                         VOID,
>>>                                         function,
>>>                                         1,
>>>                                         args);
>>>   gg_append_statement(the_call);
>>>   }
>>> 
>>> the call is not optimized away, and the generated executable behaves as
>>> expected.
>>> 
>>> How do I prevent the call to gg_exit() from being optimized away?
>>> 
>>> Thanks!

Reply via email to