On 18 Jan 2023, at 23:16, Ludovic Courtès <ludo@gnu.org> wrote:

Hi Daniel,

lloda <lloda@sarc.name> skribis:

.../libguile/threads.h:194:43: error: 'scm_i_current_thread' is defined with tls model global-dynamic
194 | SCM_INTERNAL SCM_THREAD_LOCAL scm_thread *scm_i_current_thread;
    |                                           ^
.../libguile/threads.c:357:30: note: previously defined here as local-dynamic
357 | SCM_THREAD_LOCAL scm_thread *scm_i_current_thread = NULL;

Simply repeating SCM_INTERNAL in the .c fixes it...

The problem is that ‘SCM_INTERNAL’ is synonymous with ‘extern’, which
makes no sense for a definition (threads.c:357), so rightfully GCC
GNU/Linux rightfully complains:

--8<---------------cut here---------------start------------->8---
CC       libguile_3.0_la-threads.lo
threads.c:358:43: warning: 'scm_i_current_thread' initialized and declared 'extern'
358 | SCM_INTERNAL SCM_THREAD_LOCAL scm_thread *scm_i_current_thread = NULL;
    |                                           ^~~~~~~~~~~~~~~~~~~~
--8<---------------cut here---------------end--------------->8---

It’s just a warning, but still not looking good.

Hi,

Agreed, I had the same warning on mac os. Looked like the least bad choice...

Is there something else at play, such as a ‘-ftls-model’ flag being
passed to GCC somehow (info “(gcc) Code Gen Options")?

If not, should we have:

#define SCM_THREAD_LOCAL \
  __thread __attribute__ ((__tls_model__ ("global-dynamic")))

instead (info "(gcc) Common Variable Attributes")?

Would that work with Clang?

Ludo’.

I don't seem to have any such flags.

The attribute does fix the issue on mac os with gcc 12.

I hadn't tried clang before, but I did now, and clang 14 works fine with or without the attribute. So the fix would only be for gcc.

Thanks

 Daniel