diff --git a/llvm/include/llvm/IR/EHPersonalities.h b/llvm/include/llvm/IR/EHPersonalities.h index bd768440bfb9a..c70f832de40b4 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 fb5e2d5c517ec..7c32601b8a83e 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 3ac5c2559ddf9..f6684834a7722 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 0000000000000..b28f0dd17599a --- /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