Skip to content

Commit da31a54

Browse files
committed
[IR][ARM64EC] Fix setting of ARM64EC libcall names
Fixes llvm#142544, which incorrectly used #name in the `HANDLE_LIBCALL` macro. Since name is already a string, this led to extra quotes in the symbol name, resulting in calls like `b "#\"memcpy\""`. Some libcalls do not have an associated name and use nullptr instead. To handle these cases cleanly, introduce a new `HANDLE_NAMELESS_LIBCALL` macro that allows skipping them in the logic.
1 parent 4236423 commit da31a54

File tree

3 files changed

+78
-25
lines changed

3 files changed

+78
-25
lines changed

llvm/include/llvm/IR/RuntimeLibcalls.def

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@
2929
#error "HANDLE_LIBCALL must be defined"
3030
#endif
3131

32+
#ifndef HANDLE_NAMELESS_LIBCALL
33+
#define HANDLE_NAMELESS_LIBCALL(code) HANDLE_LIBCALL(code, nullptr)
34+
#endif
35+
3236
// Integer
3337
HANDLE_LIBCALL(SHL_I16, "__ashlhi3")
3438
HANDLE_LIBCALL(SHL_I32, "__ashlsi3")
@@ -70,16 +74,16 @@ HANDLE_LIBCALL(UREM_I16, "__umodhi3")
7074
HANDLE_LIBCALL(UREM_I32, "__umodsi3")
7175
HANDLE_LIBCALL(UREM_I64, "__umoddi3")
7276
HANDLE_LIBCALL(UREM_I128, "__umodti3")
73-
HANDLE_LIBCALL(SDIVREM_I8, nullptr)
74-
HANDLE_LIBCALL(SDIVREM_I16, nullptr)
75-
HANDLE_LIBCALL(SDIVREM_I32, nullptr)
76-
HANDLE_LIBCALL(SDIVREM_I64, nullptr)
77-
HANDLE_LIBCALL(SDIVREM_I128, nullptr)
78-
HANDLE_LIBCALL(UDIVREM_I8, nullptr)
79-
HANDLE_LIBCALL(UDIVREM_I16, nullptr)
80-
HANDLE_LIBCALL(UDIVREM_I32, nullptr)
81-
HANDLE_LIBCALL(UDIVREM_I64, nullptr)
82-
HANDLE_LIBCALL(UDIVREM_I128, nullptr)
77+
HANDLE_NAMELESS_LIBCALL(SDIVREM_I8)
78+
HANDLE_NAMELESS_LIBCALL(SDIVREM_I16)
79+
HANDLE_NAMELESS_LIBCALL(SDIVREM_I32)
80+
HANDLE_NAMELESS_LIBCALL(SDIVREM_I64)
81+
HANDLE_NAMELESS_LIBCALL(SDIVREM_I128)
82+
HANDLE_NAMELESS_LIBCALL(UDIVREM_I8)
83+
HANDLE_NAMELESS_LIBCALL(UDIVREM_I16)
84+
HANDLE_NAMELESS_LIBCALL(UDIVREM_I32)
85+
HANDLE_NAMELESS_LIBCALL(UDIVREM_I64)
86+
HANDLE_NAMELESS_LIBCALL(UDIVREM_I128)
8387
HANDLE_LIBCALL(NEG_I32, "__negsi2")
8488
HANDLE_LIBCALL(NEG_I64, "__negdi2")
8589
HANDLE_LIBCALL(CTLZ_I32, "__clzsi2")
@@ -240,13 +244,13 @@ HANDLE_LIBCALL(ATAN2_F64, "atan2")
240244
HANDLE_LIBCALL(ATAN2_F80, "atan2l")
241245
HANDLE_LIBCALL(ATAN2_F128,"atan2l")
242246
HANDLE_LIBCALL(ATAN2_PPCF128, "atan2l")
243-
HANDLE_LIBCALL(SINCOS_F32, nullptr)
244-
HANDLE_LIBCALL(SINCOS_F64, nullptr)
245-
HANDLE_LIBCALL(SINCOS_F80, nullptr)
246-
HANDLE_LIBCALL(SINCOS_F128, nullptr)
247-
HANDLE_LIBCALL(SINCOS_PPCF128, nullptr)
248-
HANDLE_LIBCALL(SINCOS_STRET_F32, nullptr)
249-
HANDLE_LIBCALL(SINCOS_STRET_F64, nullptr)
247+
HANDLE_NAMELESS_LIBCALL(SINCOS_F32)
248+
HANDLE_NAMELESS_LIBCALL(SINCOS_F64)
249+
HANDLE_NAMELESS_LIBCALL(SINCOS_F80)
250+
HANDLE_NAMELESS_LIBCALL(SINCOS_F128)
251+
HANDLE_NAMELESS_LIBCALL(SINCOS_PPCF128)
252+
HANDLE_NAMELESS_LIBCALL(SINCOS_STRET_F32)
253+
HANDLE_NAMELESS_LIBCALL(SINCOS_STRET_F64)
250254
HANDLE_LIBCALL(POW_F32, "powf")
251255
HANDLE_LIBCALL(POW_F64, "pow")
252256
HANDLE_LIBCALL(POW_F80, "powl")
@@ -518,7 +522,7 @@ HANDLE_LIBCALL(MEMMOVE, "memmove")
518522
HANDLE_LIBCALL(MEMSET, "memset")
519523
// DSEPass can emit calloc if it finds a pair of malloc/memset
520524
HANDLE_LIBCALL(CALLOC, "calloc")
521-
HANDLE_LIBCALL(BZERO, nullptr)
525+
HANDLE_NAMELESS_LIBCALL(BZERO)
522526

523527
// Element-wise unordered-atomic memory of different sizes
524528
HANDLE_LIBCALL(MEMCPY_ELEMENT_UNORDERED_ATOMIC_1, "__llvm_memcpy_element_unordered_atomic_1")
@@ -669,10 +673,10 @@ HANDLE_LIBCALL(ATOMIC_FETCH_NAND_16, "__atomic_fetch_nand_16")
669673

670674
// Out-of-line atomics libcalls
671675
#define HLCALLS(A, N) \
672-
HANDLE_LIBCALL(A##N##_RELAX, nullptr) \
673-
HANDLE_LIBCALL(A##N##_ACQ, nullptr) \
674-
HANDLE_LIBCALL(A##N##_REL, nullptr) \
675-
HANDLE_LIBCALL(A##N##_ACQ_REL, nullptr)
676+
HANDLE_NAMELESS_LIBCALL(A##N##_RELAX) \
677+
HANDLE_NAMELESS_LIBCALL(A##N##_ACQ) \
678+
HANDLE_NAMELESS_LIBCALL(A##N##_REL) \
679+
HANDLE_NAMELESS_LIBCALL(A##N##_ACQ_REL)
676680
#define HLCALL5(A) \
677681
HLCALLS(A, 1) HLCALLS(A, 2) HLCALLS(A, 4) HLCALLS(A, 8) HLCALLS(A, 16)
678682
HLCALL5(OUTLINE_ATOMIC_CAS)
@@ -691,11 +695,12 @@ HANDLE_LIBCALL(STACKPROTECTOR_CHECK_FAIL, "__stack_chk_fail")
691695
HANDLE_LIBCALL(DEOPTIMIZE, "__llvm_deoptimize")
692696

693697
// Return address
694-
HANDLE_LIBCALL(RETURN_ADDRESS, nullptr)
698+
HANDLE_NAMELESS_LIBCALL(RETURN_ADDRESS)
695699

696700
// Clear cache
697701
HANDLE_LIBCALL(CLEAR_CACHE, "__clear_cache")
698702
HANDLE_LIBCALL(RISCV_FLUSH_ICACHE, "__riscv_flush_icache")
699703

700-
HANDLE_LIBCALL(UNKNOWN_LIBCALL, nullptr)
704+
HANDLE_NAMELESS_LIBCALL(UNKNOWN_LIBCALL)
701705

706+
#undef HANDLE_NAMELESS_LIBCALL

llvm/lib/IR/RuntimeLibcalls.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,9 @@ static void setAArch64LibcallNames(RuntimeLibcallsInfo &Info,
2424
{ \
2525
const char *libcallName = Info.getLibcallName(RTLIB::code); \
2626
if (libcallName && libcallName[0] != '#') \
27-
Info.setLibcallName(RTLIB::code, "#" #name); \
27+
Info.setLibcallName(RTLIB::code, "#" name); \
2828
}
29+
#define HANDLE_NAMELESS_LIBCALL(code)
2930
#include "llvm/IR/RuntimeLibcalls.def"
3031
#undef HANDLE_LIBCALL
3132
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
; RUN: llc -filetype asm -o - %s | FileCheck %s
2+
3+
target datalayout = "e-m:w-p270:32:32-p271:32:32-p272:64:64-p:64:64-i32:32-i64:64-i128:128-n32:64-S128-Fn32"
4+
target triple = "arm64ec-unknown-windows-msvc19.33.0"
5+
6+
; Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable
7+
define dso_local void @test_memcpy(ptr noundef writeonly captures(none) %0, ptr noundef readonly captures(none) %1, i64 noundef %2) local_unnamed_addr #0 {
8+
tail call void @llvm.memcpy.p0.p0.i64(ptr align 1 %0, ptr align 1 %1, i64 %2, i1 false)
9+
; CHECK: b "#memcpy"
10+
ret void
11+
}
12+
13+
; Function Attrs: mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite)
14+
declare void @llvm.memcpy.p0.p0.i64(ptr noalias writeonly captures(none), ptr noalias readonly captures(none), i64, i1 immarg) #1
15+
16+
; Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable
17+
define dso_local void @test_memmove(ptr noundef writeonly captures(none) %0, ptr noundef readonly captures(none) %1, i64 noundef %2) local_unnamed_addr #0 {
18+
tail call void @llvm.memmove.p0.p0.i64(ptr align 1 %0, ptr align 1 %1, i64 %2, i1 false)
19+
; CHECK: b "#memmove"
20+
ret void
21+
}
22+
23+
; Function Attrs: mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite)
24+
declare void @llvm.memmove.p0.p0.i64(ptr writeonly captures(none), ptr readonly captures(none), i64, i1 immarg) #1
25+
26+
; Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) uwtable
27+
define dso_local void @test_memset(ptr noundef writeonly captures(none) %0, i64 noundef %1) local_unnamed_addr #2 {
28+
tail call void @llvm.memset.p0.i64(ptr align 1 %0, i8 0, i64 %1, i1 false)
29+
; CHECK: b "#memset"
30+
ret void
31+
}
32+
33+
; Function Attrs: mustprogress nocallback nofree nounwind willreturn memory(argmem: write)
34+
declare void @llvm.memset.p0.i64(ptr writeonly captures(none), i8, i64, i1 immarg) #3
35+
36+
attributes #0 = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="generic" "target-features"="+fp-armv8,+neon,+v8a,-fmv" }
37+
attributes #1 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite) }
38+
attributes #2 = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) uwtable "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="generic" "target-features"="+fp-armv8,+neon,+v8a,-fmv" }
39+
attributes #3 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: write) }
40+
41+
!llvm.module.flags = !{!0, !1, !2}
42+
!llvm.ident = !{!3}
43+
44+
!0 = !{i32 1, !"wchar_size", i32 2}
45+
!1 = !{i32 8, !"PIC Level", i32 2}
46+
!2 = !{i32 7, !"uwtable", i32 2}
47+
!3 = !{!"clang version 21.0.0git"}

0 commit comments

Comments
 (0)