Index: include/llvm/Analysis/EHPersonalities.h =================================================================== --- include/llvm/Analysis/EHPersonalities.h +++ include/llvm/Analysis/EHPersonalities.h @@ -25,7 +25,9 @@ MSVC_X86SEH, MSVC_Win64SEH, MSVC_CXX, - CoreCLR + CoreCLR, + Unknown_With_Token_LP // similar to Unknown, except that + // LandingPads have token types. }; /// \brief See if the given exception handling personality function is one @@ -68,6 +70,7 @@ inline bool isNoOpWithoutInvoke(EHPersonality Pers) { switch (Pers) { case EHPersonality::Unknown: + case EHPersonality::Unknown_With_Token_LP: return false; // All known personalities currently have this behavior default: Index: lib/Analysis/EHPersonalities.cpp =================================================================== --- lib/Analysis/EHPersonalities.cpp +++ lib/Analysis/EHPersonalities.cpp @@ -29,6 +29,7 @@ .Case("__C_specific_handler", EHPersonality::MSVC_Win64SEH) .Case("__CxxFrameHandler3", EHPersonality::MSVC_CXX) .Case("ProcessCLRException", EHPersonality::CoreCLR) + .Case("UnknownWithTokenLP", EHPersonality::Unknown_With_Token_LP) .Default(EHPersonality::Unknown); } Index: lib/Target/X86/X86ISelLowering.cpp =================================================================== --- lib/Target/X86/X86ISelLowering.cpp +++ lib/Target/X86/X86ISelLowering.cpp @@ -17432,6 +17432,12 @@ unsigned X86TargetLowering::getExceptionPointerRegister( const Constant *PersonalityFn) const { + // LandingPad of token type currently doesn't support exception pointer + // extraction. + if (classifyEHPersonality(PersonalityFn) == + EHPersonality::Unknown_With_Token_LP) + return 0; + if (classifyEHPersonality(PersonalityFn) == EHPersonality::CoreCLR) return Subtarget->isTarget64BitLP64() ? X86::RDX : X86::EDX; @@ -17442,6 +17448,12 @@ const Constant *PersonalityFn) const { // Funclet personalities don't use selectors (the runtime does the selection). assert(!isFuncletEHPersonality(classifyEHPersonality(PersonalityFn))); + // LandingPad of token type currently doesn't support selector value + // extraction. + if (classifyEHPersonality(PersonalityFn) == + EHPersonality::Unknown_With_Token_LP) + return 0; + return Subtarget->isTarget64BitLP64() ? X86::RDX : X86::EDX; } Index: lib/Transforms/InstCombine/InstructionCombining.cpp =================================================================== --- lib/Transforms/InstCombine/InstructionCombining.cpp +++ lib/Transforms/InstCombine/InstructionCombining.cpp @@ -2351,6 +2351,7 @@ // clear what the semantics of catch clauses are. return false; case EHPersonality::Unknown: + case EHPersonality::Unknown_With_Token_LP: return false; case EHPersonality::GNU_Ada: // While __gnat_all_others_value will match any Ada exception, it doesn't Index: test/CodeGen/X86/token_landingpad.ll =================================================================== --- test/CodeGen/X86/token_landingpad.ll +++ test/CodeGen/X86/token_landingpad.ll @@ -1,15 +1,17 @@ -; RUN: llc < %s | FileCheck %s +; RUN: llc < %s | FileCheck %s -define void @test() personality i32 (...)* @ProcessTokenLandingPad { -; CHECK: .cfi_personality 155, _ProcessTokenLanding +; This test verify that SelectionDAG can handle landingPad of token type. + +define void @test() personality i32 (...)* @UnknownWithTokenLP { +; CHECK: .cfi_personality 155, _UnknownWithTokenLP entry: invoke void @dummy() to label %return unwind label %unwind unwind: ; preds = %entry - %exn = landingpad token + %lp = landingpad token cleanup - br label %return + br label %return return: ; preds = %entry ret void @@ -17,4 +19,4 @@ declare void @dummy() -declare i32 @ProcessTokenLandingPad(...) +declare i32 @UnknownWithTokenLP(...)