On 4/22/25 4:48 PM, Jason Merrill wrote:
On 4/22/25 1:21 PM, Tobias Burnus wrote:
Jason Merrill wrote:
On 4/22/25 11:04 AM, Tobias Burnus wrote:
The question is why does this code trigger at all, given
that there is OpenMP but no offload code at all? And how
to fix it in case there is offload code and modules are used.

This seems to be because of:

  if (module_global_init_needed ())
    {
      // Make sure there's a default priority entry.       if (! static_init_fini_fns[true])
        static_init_fini_fns[true] = priority_map_t::create_ggc ();
      if (static_init_fini_fns[true]->get_or_insert (DEFAULT_INIT_PRIORITY))
        has_module_inits = true;

      if (flag_openmp)
        {
          if (!static_init_fini_fns[2 + true])
            static_init_fini_fns[2 + true] = priority_map_t::create_ggc ();           static_init_fini_fns[2 + true]->get_or_insert (DEFAULT_INIT_PRIORITY);
        }
    }

Here we're forcing a target module init function as well as host. If we remove the flag_openmp block, Nathaniel's patch is unnecessary (but may still be desirable).

I currently do not see whether the code is needed in this case or not, but I assume it is, if we want to support static initializers?!?

I don't think so.  For the host, we force create a map with a single entry because we always want to emit a module init function.  The openmp block is saying we also always want a target init function in a module, even if it's empty, which I don't think is correct.  Or if it is, we need to specify how to mangle it and agree that that's part of the module ABI.

So, for now in addition to Nathaniel's patch I'd remove this flag_openmp block so we don't get an unneeded empty function, and maybe add something back later after more discussion.

Jason

Reply via email to