diff options
author | Kai Nacke <kai.peter.nacke@ibm.com> | 2024-04-23 10:39:03 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-04-23 10:39:03 -0400 |
commit | d5022d9ad4aec250f77d21c819a9810a97b8b6a8 (patch) | |
tree | 3cf19409a735558f6e45c1190571d895620b4257 | |
parent | 74cab546825b32f24e44d69942cdbdd129160471 (diff) |
[SystemZ][z/OS] Make z/OS personality function known (#89679)
This change adds the z/OS personality function to the list of known EH
personality functions. It enables removing of the EH data/labels if the
personality function is not invoked.
-rw-r--r-- | llvm/include/llvm/IR/EHPersonalities.h | 3 | ||||
-rw-r--r-- | llvm/lib/IR/EHPersonalities.cpp | 3 | ||||
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstructionCombining.cpp | 1 | ||||
-rw-r--r-- | llvm/test/CodeGen/SystemZ/zos-no-eh-label.ll | 12 |
4 files changed, 18 insertions, 1 deletions
diff --git a/llvm/include/llvm/IR/EHPersonalities.h b/llvm/include/llvm/IR/EHPersonalities.h index bd768440bfb9..c70f832de40b 100644 --- a/llvm/include/llvm/IR/EHPersonalities.h +++ b/llvm/include/llvm/IR/EHPersonalities.h @@ -32,7 +32,8 @@ enum class EHPersonality { CoreCLR, Rust, Wasm_CXX, - XL_CXX + XL_CXX, + ZOS_CXX, }; /// See if the given exception handling personality function is one diff --git a/llvm/lib/IR/EHPersonalities.cpp b/llvm/lib/IR/EHPersonalities.cpp index fb5e2d5c517e..7c32601b8a83 100644 --- a/llvm/lib/IR/EHPersonalities.cpp +++ b/llvm/lib/IR/EHPersonalities.cpp @@ -42,6 +42,7 @@ EHPersonality llvm::classifyEHPersonality(const Value *Pers) { .Case("rust_eh_personality", EHPersonality::Rust) .Case("__gxx_wasm_personality_v0", EHPersonality::Wasm_CXX) .Case("__xlcxx_personality_v1", EHPersonality::XL_CXX) + .Case("__zos_cxx_personality_v2", EHPersonality::ZOS_CXX) .Default(EHPersonality::Unknown); } @@ -73,6 +74,8 @@ StringRef llvm::getEHPersonalityName(EHPersonality Pers) { return "__gxx_wasm_personality_v0"; case EHPersonality::XL_CXX: return "__xlcxx_personality_v1"; + case EHPersonality::ZOS_CXX: + return "__zos_cxx_personality_v2"; case EHPersonality::Unknown: llvm_unreachable("Unknown EHPersonality!"); } diff --git a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp index 3ac5c2559ddf..f6684834a772 100644 --- a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp +++ b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp @@ -3972,6 +3972,7 @@ static bool isCatchAll(EHPersonality Personality, Constant *TypeInfo) { case EHPersonality::CoreCLR: case EHPersonality::Wasm_CXX: case EHPersonality::XL_CXX: + case EHPersonality::ZOS_CXX: return TypeInfo->isNullValue(); } llvm_unreachable("invalid enum"); diff --git a/llvm/test/CodeGen/SystemZ/zos-no-eh-label.ll b/llvm/test/CodeGen/SystemZ/zos-no-eh-label.ll new file mode 100644 index 000000000000..b28f0dd17599 --- /dev/null +++ b/llvm/test/CodeGen/SystemZ/zos-no-eh-label.ll @@ -0,0 +1,12 @@ +; RUN: llc -mtriple s390x-ibm-zos < %s | FileCheck %s + +define signext i32 @_Z9computeitv() personality ptr @__zos_cxx_personality_v2 { + ret i32 0 +} + +declare i32 @__zos_cxx_personality_v2(...) + +; The personality function is unused, therefore check that it is not referenced. +; There should also be no exception table. +; CHECK-NOT: __zos_cxx_personality_v2 +; CHECK-NOT: GCC_except_table |