Skip to content

thinlto tests broken by recent change to use TLS to store musl's current locale. #26506

@sbc100

Description

@sbc100

With #26486 we started using TLS (C11 _Thread_local) to store the current local.

This seems to have a bad interaction this thinglto due to some kind LLVM issue.

Gemini says:

✦ Triage of recent CI failures identified a regression in ThinLTO builds using pthreads, specifically failing in test_pthread_dylink and other related tests. The failures were triggered by a recent Emscripten change (#26486 (#26486)) that introduced a _Thread_local variable for locale support in musl.

The root cause was a bug in the LLVM WebAssembly backend's CoalesceFeaturesAndStripAtomics pass. This pass determines the union of features for a module based only on its defined functions. In ThinLTO builds, if a function like __uselocale is inlined into all its callers, its original module may be left with no defined functions but still contain the thread_local variable definition. In such cases, the pass would fail to
enable the bulk-memory feature, leading it to incorrectly strip the TLS attribute from the variable or lower it to a non-TLS section. This resulted in wasm-ld errors about disallowed shared memory or relocation mismatches.

I have implemented a fix in llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp that ensures coalesceFeatures also inspects global variables for the thread_local attribute. If found, it explicitly enables the bulk-memory and atomics features for the module, preventing the incorrect stripping of TLS. This fix was verified to resolve both a minimal reproduction case and the original test_pthread_dylink failure.

Changes:

  • Modified llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp to include thread_local globals in the feature coalescence logic.
  • Verified the fix with emscripten/test/runner.py thinltoz.test_pthread_dylink.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions