Skip to content

[win][arm64ec] Handle available_externally functions #151610

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Aug 1, 2025

Conversation

dpaoliello
Copy link
Contributor

While testing Arm64EC, I observed that LLVM crashes when an available_externally function is used as it tries to place it in a COMDAT, which is not permitted by the verifier.

This the fix from #151409 plus a dedicated test.

@llvmbot
Copy link
Member

llvmbot commented Jul 31, 2025

@llvm/pr-subscribers-backend-aarch64

@llvm/pr-subscribers-platform-windows

Author: Daniel Paoliello (dpaoliello)

Changes

While testing Arm64EC, I observed that LLVM crashes when an available_externally function is used as it tries to place it in a COMDAT, which is not permitted by the verifier.

This the fix from #151409 plus a dedicated test.


Full diff: https://github.com/llvm/llvm-project/pull/151610.diff

2 Files Affected:

  • (modified) llvm/lib/Target/AArch64/AArch64Arm64ECCallLowering.cpp (+1-1)
  • (added) llvm/test/CodeGen/AArch64/arm64ec-available-externally.ll (+9)
diff --git a/llvm/lib/Target/AArch64/AArch64Arm64ECCallLowering.cpp b/llvm/lib/Target/AArch64/AArch64Arm64ECCallLowering.cpp
index 509cbb092705d..8390c1f291365 100644
--- a/llvm/lib/Target/AArch64/AArch64Arm64ECCallLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64Arm64ECCallLowering.cpp
@@ -872,7 +872,7 @@ bool AArch64Arm64ECCallLowering::runOnModule(Module &Mod) {
     if (!F.isDeclaration() && (!F.hasLocalLinkage() || F.hasAddressTaken()) &&
         F.getCallingConv() != CallingConv::ARM64EC_Thunk_Native &&
         F.getCallingConv() != CallingConv::ARM64EC_Thunk_X64) {
-      if (!F.hasComdat())
+      if (!F.hasComdat() && !F.isDeclarationForLinker())
         F.setComdat(Mod.getOrInsertComdat(F.getName()));
       ThunkMapping.push_back(
           {&F, buildEntryThunk(&F), Arm64ECThunkType::Entry});
diff --git a/llvm/test/CodeGen/AArch64/arm64ec-available-externally.ll b/llvm/test/CodeGen/AArch64/arm64ec-available-externally.ll
new file mode 100644
index 0000000000000..9457302403d4c
--- /dev/null
+++ b/llvm/test/CodeGen/AArch64/arm64ec-available-externally.ll
@@ -0,0 +1,9 @@
+; RUN: llc -mtriple arm64ec-windows-msvc < %s
+
+; Arm64EC Regression Test: The Arm64EC Call Lowering was placing "available
+; externally" items in COMDATs, which is not permitted by the module verifier.
+
+define available_externally i32 @f() {
+entry:
+  ret i32 0
+}

@@ -872,7 +872,7 @@ bool AArch64Arm64ECCallLowering::runOnModule(Module &Mod) {
if (!F.isDeclaration() && (!F.hasLocalLinkage() || F.hasAddressTaken()) &&
F.getCallingConv() != CallingConv::ARM64EC_Thunk_Native &&
F.getCallingConv() != CallingConv::ARM64EC_Thunk_X64) {
if (!F.hasComdat())
if (!F.hasComdat() && !F.isDeclarationForLinker())
F.setComdat(Mod.getOrInsertComdat(F.getName()));
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We also want to skip creating an entry thunk for an available_externally function. The thunk should be provided by the translation unit that actually defines the function, and emitting an extra one could cause weird linker behavior.

We still may need a exit thunk, if the function is called.

I'd like to see the test show that we don't create an entry thunk, and do create an exit thunk.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good call: expanded the test and fixed other cases where we should be using isDeclarationForLinker instead of isDeclaration.

@mstorsjo mstorsjo requested a review from cjacek August 1, 2025 09:27
Copy link
Collaborator

@efriedma-quic efriedma-quic left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@dpaoliello dpaoliello merged commit c696ecd into llvm:main Aug 1, 2025
9 checks passed
@dpaoliello dpaoliello deleted the ecea branch August 1, 2025 21:04
@llvm-ci
Copy link
Collaborator

llvm-ci commented Aug 1, 2025

LLVM Buildbot has detected a new failure on builder fuchsia-x86_64-linux running on fuchsia-debian-64-us-central1-b-1 while building llvm at step 4 "annotate".

Full details are available at: https://lab.llvm.org/buildbot/#/builders/11/builds/20918

Here is the relevant piece of the build log for the reference
Step 4 (annotate) failure: 'python ../llvm-zorg/zorg/buildbot/builders/annotated/fuchsia-linux.py ...' (failure)
...
[690/1396] Building CXX object unittests/ADT/CMakeFiles/ADTTests.dir/IntrusiveRefCntPtrTest.cpp.o
[691/1396] Building CXX object unittests/ADT/CMakeFiles/ADTTests.dir/IListBaseTest.cpp.o
[692/1396] Linking CXX executable bin/yaml2obj
[692/1396] Running lld test suite
llvm-lit: /var/lib/buildbot/fuchsia-x86_64-linux/llvm-project/llvm/utils/lit/lit/llvm/config.py:520: note: using ld.lld: /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/bin/ld.lld
llvm-lit: /var/lib/buildbot/fuchsia-x86_64-linux/llvm-project/llvm/utils/lit/lit/llvm/config.py:520: note: using lld-link: /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/bin/lld-link
llvm-lit: /var/lib/buildbot/fuchsia-x86_64-linux/llvm-project/llvm/utils/lit/lit/llvm/config.py:520: note: using ld64.lld: /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/bin/ld64.lld
llvm-lit: /var/lib/buildbot/fuchsia-x86_64-linux/llvm-project/llvm/utils/lit/lit/llvm/config.py:520: note: using wasm-ld: /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/bin/wasm-ld
-- Testing: 3130 tests, 60 workers --
Testing:  0..
FAIL: lld :: COFF/import_weak_alias.test (283 of 3130)
******************** TEST 'lld :: COFF/import_weak_alias.test' FAILED ********************
Exit Code: 139

Command Output (stderr):
--
split-file /var/lib/buildbot/fuchsia-x86_64-linux/llvm-project/lld/test/COFF/import_weak_alias.test /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/tools/lld/test/COFF/Output/import_weak_alias.test.tmp.dir # RUN: at line 3
+ split-file /var/lib/buildbot/fuchsia-x86_64-linux/llvm-project/lld/test/COFF/import_weak_alias.test /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/tools/lld/test/COFF/Output/import_weak_alias.test.tmp.dir
/var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/bin/llvm-mc --filetype=obj -triple=x86_64-windows-msvc /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/tools/lld/test/COFF/Output/import_weak_alias.test.tmp.dir/foo.s -o /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/tools/lld/test/COFF/Output/import_weak_alias.test.tmp.foo.obj # RUN: at line 4
+ /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/bin/llvm-mc --filetype=obj -triple=x86_64-windows-msvc /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/tools/lld/test/COFF/Output/import_weak_alias.test.tmp.dir/foo.s -o /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/tools/lld/test/COFF/Output/import_weak_alias.test.tmp.foo.obj
/var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/bin/llvm-mc --filetype=obj -triple=x86_64-windows-msvc /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/tools/lld/test/COFF/Output/import_weak_alias.test.tmp.dir/qux.s -o /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/tools/lld/test/COFF/Output/import_weak_alias.test.tmp.qux.obj # RUN: at line 5
+ /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/bin/llvm-mc --filetype=obj -triple=x86_64-windows-msvc /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/tools/lld/test/COFF/Output/import_weak_alias.test.tmp.dir/qux.s -o /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/tools/lld/test/COFF/Output/import_weak_alias.test.tmp.qux.obj
/var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/bin/lld-link /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/tools/lld/test/COFF/Output/import_weak_alias.test.tmp.qux.obj /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/tools/lld/test/COFF/Output/import_weak_alias.test.tmp.foo.obj -out:/var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/tools/lld/test/COFF/Output/import_weak_alias.test.tmp.dll -dll # RUN: at line 6
+ /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/bin/lld-link /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/tools/lld/test/COFF/Output/import_weak_alias.test.tmp.qux.obj /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/tools/lld/test/COFF/Output/import_weak_alias.test.tmp.foo.obj -out:/var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/tools/lld/test/COFF/Output/import_weak_alias.test.tmp.dll -dll
/var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/tools/lld/test/COFF/Output/import_weak_alias.test.script: line 4: 3830953 Segmentation fault      (core dumped) /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/bin/lld-link /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/tools/lld/test/COFF/Output/import_weak_alias.test.tmp.qux.obj /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/tools/lld/test/COFF/Output/import_weak_alias.test.tmp.foo.obj -out:/var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/tools/lld/test/COFF/Output/import_weak_alias.test.tmp.dll -dll

--

********************
Testing:  0.. 10.. 20.. 30.. 40.. 50.. 60.. 70.. 80.. 90.. 
********************
Failed Tests (1):
  lld :: COFF/import_weak_alias.test


Testing Time: 26.25s

Total Discovered Tests: 3130
  Unsupported:  568 (18.15%)
  Passed     : 2561 (81.82%)
  Failed     :    1 (0.03%)
[827/1396] Building CXX object unittests/CodeGen/CMakeFiles/CodeGenTests.dir/GCMetadata.cpp.o
FAILED: tools/lld/test/CMakeFiles/check-lld /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/tools/lld/test/CMakeFiles/check-lld 
cd /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/tools/lld/test && /usr/bin/python3.10 /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/./bin/llvm-lit -sv /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/tools/lld/test
[829/1396] Building CXX object unittests/ADT/CMakeFiles/ADTTests.dir/STLExtrasTest.cpp.o
[830/1396] Building CXX object unittests/DebugInfo/CodeView/CMakeFiles/DebugInfoCodeViewTests.dir/RandomAccessVisitorTest.cpp.o
[831/1396] Building CXX object unittests/DebugInfo/DWARF/CMakeFiles/DebugInfoDWARFTests.dir/DWARFDebugArangeSetTest.cpp.o
[832/1396] Building CXX object unittests/CodeGen/CMakeFiles/CodeGenTests.dir/SchedBoundary.cpp.o
[833/1396] Building CXX object unittests/DebugInfo/LogicalView/CMakeFiles/DebugInfoLogicalViewTests.dir/__/DWARF/DwarfUtils.cpp.o
Step 7 (check) failure: check (failure)
...
[690/1396] Building CXX object unittests/ADT/CMakeFiles/ADTTests.dir/IntrusiveRefCntPtrTest.cpp.o
[691/1396] Building CXX object unittests/ADT/CMakeFiles/ADTTests.dir/IListBaseTest.cpp.o
[692/1396] Linking CXX executable bin/yaml2obj
[692/1396] Running lld test suite
llvm-lit: /var/lib/buildbot/fuchsia-x86_64-linux/llvm-project/llvm/utils/lit/lit/llvm/config.py:520: note: using ld.lld: /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/bin/ld.lld
llvm-lit: /var/lib/buildbot/fuchsia-x86_64-linux/llvm-project/llvm/utils/lit/lit/llvm/config.py:520: note: using lld-link: /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/bin/lld-link
llvm-lit: /var/lib/buildbot/fuchsia-x86_64-linux/llvm-project/llvm/utils/lit/lit/llvm/config.py:520: note: using ld64.lld: /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/bin/ld64.lld
llvm-lit: /var/lib/buildbot/fuchsia-x86_64-linux/llvm-project/llvm/utils/lit/lit/llvm/config.py:520: note: using wasm-ld: /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/bin/wasm-ld
-- Testing: 3130 tests, 60 workers --
Testing:  0..
FAIL: lld :: COFF/import_weak_alias.test (283 of 3130)
******************** TEST 'lld :: COFF/import_weak_alias.test' FAILED ********************
Exit Code: 139

Command Output (stderr):
--
split-file /var/lib/buildbot/fuchsia-x86_64-linux/llvm-project/lld/test/COFF/import_weak_alias.test /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/tools/lld/test/COFF/Output/import_weak_alias.test.tmp.dir # RUN: at line 3
+ split-file /var/lib/buildbot/fuchsia-x86_64-linux/llvm-project/lld/test/COFF/import_weak_alias.test /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/tools/lld/test/COFF/Output/import_weak_alias.test.tmp.dir
/var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/bin/llvm-mc --filetype=obj -triple=x86_64-windows-msvc /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/tools/lld/test/COFF/Output/import_weak_alias.test.tmp.dir/foo.s -o /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/tools/lld/test/COFF/Output/import_weak_alias.test.tmp.foo.obj # RUN: at line 4
+ /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/bin/llvm-mc --filetype=obj -triple=x86_64-windows-msvc /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/tools/lld/test/COFF/Output/import_weak_alias.test.tmp.dir/foo.s -o /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/tools/lld/test/COFF/Output/import_weak_alias.test.tmp.foo.obj
/var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/bin/llvm-mc --filetype=obj -triple=x86_64-windows-msvc /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/tools/lld/test/COFF/Output/import_weak_alias.test.tmp.dir/qux.s -o /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/tools/lld/test/COFF/Output/import_weak_alias.test.tmp.qux.obj # RUN: at line 5
+ /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/bin/llvm-mc --filetype=obj -triple=x86_64-windows-msvc /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/tools/lld/test/COFF/Output/import_weak_alias.test.tmp.dir/qux.s -o /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/tools/lld/test/COFF/Output/import_weak_alias.test.tmp.qux.obj
/var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/bin/lld-link /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/tools/lld/test/COFF/Output/import_weak_alias.test.tmp.qux.obj /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/tools/lld/test/COFF/Output/import_weak_alias.test.tmp.foo.obj -out:/var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/tools/lld/test/COFF/Output/import_weak_alias.test.tmp.dll -dll # RUN: at line 6
+ /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/bin/lld-link /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/tools/lld/test/COFF/Output/import_weak_alias.test.tmp.qux.obj /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/tools/lld/test/COFF/Output/import_weak_alias.test.tmp.foo.obj -out:/var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/tools/lld/test/COFF/Output/import_weak_alias.test.tmp.dll -dll
/var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/tools/lld/test/COFF/Output/import_weak_alias.test.script: line 4: 3830953 Segmentation fault      (core dumped) /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/bin/lld-link /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/tools/lld/test/COFF/Output/import_weak_alias.test.tmp.qux.obj /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/tools/lld/test/COFF/Output/import_weak_alias.test.tmp.foo.obj -out:/var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/tools/lld/test/COFF/Output/import_weak_alias.test.tmp.dll -dll

--

********************
Testing:  0.. 10.. 20.. 30.. 40.. 50.. 60.. 70.. 80.. 90.. 
********************
Failed Tests (1):
  lld :: COFF/import_weak_alias.test


Testing Time: 26.25s

Total Discovered Tests: 3130
  Unsupported:  568 (18.15%)
  Passed     : 2561 (81.82%)
  Failed     :    1 (0.03%)
[827/1396] Building CXX object unittests/CodeGen/CMakeFiles/CodeGenTests.dir/GCMetadata.cpp.o
FAILED: tools/lld/test/CMakeFiles/check-lld /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/tools/lld/test/CMakeFiles/check-lld 
cd /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/tools/lld/test && /usr/bin/python3.10 /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/./bin/llvm-lit -sv /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-0phv49o6/tools/lld/test
[829/1396] Building CXX object unittests/ADT/CMakeFiles/ADTTests.dir/STLExtrasTest.cpp.o
[830/1396] Building CXX object unittests/DebugInfo/CodeView/CMakeFiles/DebugInfoCodeViewTests.dir/RandomAccessVisitorTest.cpp.o
[831/1396] Building CXX object unittests/DebugInfo/DWARF/CMakeFiles/DebugInfoDWARFTests.dir/DWARFDebugArangeSetTest.cpp.o
[832/1396] Building CXX object unittests/CodeGen/CMakeFiles/CodeGenTests.dir/SchedBoundary.cpp.o
[833/1396] Building CXX object unittests/DebugInfo/LogicalView/CMakeFiles/DebugInfoLogicalViewTests.dir/__/DWARF/DwarfUtils.cpp.o

@dpaoliello
Copy link
Contributor Author

LLVM Buildbot has detected a new failure on builder fuchsia-x86_64-linux running on fuchsia-debian-64-us-central1-b-1 while building llvm at step 4 "annotate".

Seems unrelated: this change was to Arm64EC call lowering, which is not run at all for x86. Additionally, the crash is happening at link time (with non-LTO objects), not compilation time.

krishna2803 pushed a commit to krishna2803/llvm-project that referenced this pull request Aug 12, 2025
While testing Arm64EC, I observed that LLVM crashes when an
`available_externally` function is used as it tries to place it in a
COMDAT, which is not permitted by the verifier.

This the fix from llvm#151409 plus a dedicated test.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants