Skip to content

Commit 65a21a6

Browse files
committed
[CodeGen][ARM64EC] Mangle EH personality handler names
1 parent c6f67b8 commit 65a21a6

File tree

3 files changed

+85
-1
lines changed

3 files changed

+85
-1
lines changed

llvm/lib/IR/EHPersonalities.cpp

+9-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "llvm/IR/Constants.h"
1313
#include "llvm/IR/Function.h"
1414
#include "llvm/IR/Instructions.h"
15+
#include "llvm/IR/Mangler.h"
1516
#include "llvm/IR/Module.h"
1617
#include "llvm/Support/Debug.h"
1718
#include "llvm/Support/raw_ostream.h"
@@ -25,7 +26,14 @@ EHPersonality llvm::classifyEHPersonality(const Value *Pers) {
2526
Pers ? dyn_cast<GlobalValue>(Pers->stripPointerCasts()) : nullptr;
2627
if (!F || !F->getValueType() || !F->getValueType()->isFunctionTy())
2728
return EHPersonality::Unknown;
28-
return StringSwitch<EHPersonality>(F->getName())
29+
30+
std::string Name = F->getName().str();
31+
if (Triple(F->getParent()->getTargetTriple()).isWindowsArm64EC()) {
32+
if (auto DemangledName = getArm64ECDemangledFunctionName(Name))
33+
Name = *DemangledName;
34+
}
35+
36+
return StringSwitch<EHPersonality>(Name)
2937
.Case("__gnat_eh_personality", EHPersonality::GNU_Ada)
3038
.Case("__gxx_personality_v0", EHPersonality::GNU_CXX)
3139
.Case("__gxx_personality_seh0", EHPersonality::GNU_CXX)

llvm/lib/Target/AArch64/AArch64Arm64ECCallLowering.cpp

+11
Original file line numberDiff line numberDiff line change
@@ -807,6 +807,17 @@ bool AArch64Arm64ECCallLowering::runOnModule(Module &Mod) {
807807
SetVector<GlobalAlias *> PatchableFns;
808808

809809
for (Function &F : Mod) {
810+
if (F.hasPersonalityFn()) {
811+
GlobalValue *PersFn =
812+
cast<GlobalValue>(F.getPersonalityFn()->stripPointerCasts());
813+
if (PersFn->getValueType() && PersFn->getValueType()->isFunctionTy()) {
814+
if (std::optional<std::string> MangledName =
815+
getArm64ECMangledFunctionName(PersFn->getName().str())) {
816+
PersFn->setName(MangledName.value());
817+
}
818+
}
819+
}
820+
810821
if (!F.hasFnAttribute(Attribute::HybridPatchable) || F.isDeclaration() ||
811822
F.hasLocalLinkage() || F.getName().ends_with("$hp_target"))
812823
continue;
+65
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc -mtriple=arm64ec-pc-windows-msvc %s -o - | FileCheck %s
3+
4+
define dso_local i32 @test() #0 personality ptr @__C_specific_handler {
5+
; CHECK-LABEL: "#test"
6+
; CHECK: .Lfunc_begin0:
7+
; CHECK-NEXT: .seh_proc "#test"
8+
; CHECK-NEXT: .seh_handler "#__C_specific_handler", @unwind, @except
9+
; CHECK-NEXT: // %bb.0:
10+
; CHECK-NEXT: sub sp, sp, #48
11+
; CHECK-NEXT: .seh_stackalloc 48
12+
; CHECK-NEXT: stp x29, x30, [sp, #16] // 16-byte Folded Spill
13+
; CHECK-NEXT: .seh_save_fplr 16
14+
; CHECK-NEXT: add x29, sp, #16
15+
; CHECK-NEXT: .seh_add_fp 16
16+
; CHECK-NEXT: .seh_endprologue
17+
; CHECK-NEXT: mov x0, #-2 // =0xfffffffffffffffe
18+
; CHECK-NEXT: mov w8, #-1 // =0xffffffff
19+
; CHECK-NEXT: stur x0, [x29, #16]
20+
; CHECK-NEXT: stur w8, [x29, #-4]
21+
; CHECK-NEXT: .Ltmp0:
22+
; CHECK-NEXT: bl "#ext"
23+
; CHECK-NEXT: .Ltmp1:
24+
; CHECK-NEXT: .LBB0_1:
25+
; CHECK-NEXT: $ehgcr_0_1:
26+
; CHECK-NEXT: stur w0, [x29, #-4]
27+
; CHECK-NEXT: .seh_startepilogue
28+
; CHECK-NEXT: ldp x29, x30, [sp, #16] // 16-byte Folded Reload
29+
; CHECK-NEXT: .seh_save_fplr 16
30+
; CHECK-NEXT: add sp, sp, #48
31+
; CHECK-NEXT: .seh_stackalloc 48
32+
; CHECK-NEXT: .seh_endepilogue
33+
; CHECK-NEXT: ret
34+
; CHECK-NEXT: .LBB0_2:
35+
; CHECK-NEXT: mov w0, wzr
36+
; CHECK-NEXT: b .LBB0_1
37+
%1 = alloca i32, align 4
38+
%2 = alloca i32, align 4
39+
store i32 -1, ptr %1, align 4
40+
%3 = invoke i32 @ext() #3
41+
to label %12 unwind label %4
42+
43+
4: ; preds = %0
44+
%5 = catchswitch within none [label %6] unwind to caller
45+
46+
6: ; preds = %4
47+
%7 = catchpad within %5 [ptr null]
48+
catchret from %7 to label %8
49+
50+
8: ; preds = %6
51+
store i32 0, ptr %1, align 4
52+
br label %10
53+
54+
10: ; preds = %8, %12
55+
%11 = load i32, ptr %1, align 4
56+
ret i32 %11
57+
58+
12: ; preds = %0
59+
store i32 %3, ptr %1, align 4
60+
br label %10
61+
}
62+
63+
declare dso_local i32 @ext() #1
64+
65+
declare dso_local i32 @__C_specific_handler(...)

0 commit comments

Comments
 (0)