<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Tue, Jan 27, 2015 at 5:17 PM, Reid Kleckner <span dir="ltr"><<a href="mailto:reid@kleckner.net" target="_blank">reid@kleckner.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Author: rnk<br>
Date: Tue Jan 27 19:17:38 2015<br>
New Revision: 227284<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=227284&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=227284&view=rev</a><br>
Log:<br>
Move EH personality type classification to Analysis/LibCallSemantics.h<br>
<br>
Summary:<br>
Also add enum types for __C_specific_handler and _CxxFrameHandler3 for<br>
which we know a few things.<br>
<br>
Reviewers: majnemer<br>
<br>
Subscribers: llvm-commits<br>
<br>
Differential Revision: <a href="http://reviews.llvm.org/D7214" target="_blank">http://reviews.llvm.org/D7214</a><br>
<br>
Modified:<br>
    llvm/trunk/include/llvm/Analysis/LibCallSemantics.h<br>
    llvm/trunk/lib/Analysis/LibCallSemantics.cpp<br>
    llvm/trunk/lib/Transforms/InstCombine/InstructionCombining.cpp<br>
    llvm/trunk/test/Transforms/InstCombine/LandingPadClauses.ll<br>
<br>
Modified: llvm/trunk/include/llvm/Analysis/LibCallSemantics.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/LibCallSemantics.h?rev=227284&r1=227283&r2=227284&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/LibCallSemantics.h?rev=227284&r1=227283&r2=227284&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Analysis/LibCallSemantics.h (original)<br>
+++ llvm/trunk/include/llvm/Analysis/LibCallSemantics.h Tue Jan 27 19:17:38 2015<br>
@@ -162,6 +162,21 @@ namespace llvm {<br>
     virtual const LibCallFunctionInfo *getFunctionInfoArray() const = 0;<br>
   };<br>
<br>
+  enum class EHPersonality {<br>
+    Unknown,<br>
+    GNU_Ada,<br>
+    GNU_C,<br>
+    GNU_CXX,<br>
+    GNU_ObjC,<br>
+    MSVC_Win64SEH,<br>
+    MSVC_CXX,<br>
+  };<br></blockquote><div><br></div><div>You added a different enum class llvm::EHPersonality to llvm/CodeGen/MachineModuleInfo.h in r226920 =) Can you rename one of them? (This is an ODR violation and breaks the modules build.) Thanks!</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
+<br>
+  /// ClassifyEHPersonality - See if the given exception handling personality<br>
+  /// function is one that we understand.  If so, return a description of it;<br>
+  /// otherwise return Unknown_Personality.<br>
+  EHPersonality ClassifyEHPersonality(Value *Pers);<br>
+<br>
 } // end namespace llvm<br>
<br>
 #endif<br>
<br>
Modified: llvm/trunk/lib/Analysis/LibCallSemantics.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/LibCallSemantics.cpp?rev=227284&r1=227283&r2=227284&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/LibCallSemantics.cpp?rev=227284&r1=227283&r2=227284&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Analysis/LibCallSemantics.cpp (original)<br>
+++ llvm/trunk/lib/Analysis/LibCallSemantics.cpp Tue Jan 27 19:17:38 2015<br>
@@ -15,6 +15,7 @@<br>
<br>
 #include "llvm/Analysis/LibCallSemantics.h"<br>
 #include "llvm/ADT/StringMap.h"<br>
+#include "llvm/ADT/StringSwitch.h"<br>
 #include "llvm/IR/Function.h"<br>
 using namespace llvm;<br>
<br>
@@ -61,3 +62,18 @@ LibCallInfo::getFunctionInfo(const Funct<br>
   return Map->lookup(F->getName());<br>
 }<br>
<br>
+/// See if the given exception handling personality function is one that we<br>
+/// understand.  If so, return a description of it; otherwise return Unknown.<br>
+EHPersonality llvm::ClassifyEHPersonality(Value *Pers) {<br>
+  Function *F = dyn_cast<Function>(Pers->stripPointerCasts());<br>
+  if (!F)<br>
+    return EHPersonality::Unknown;<br>
+  return StringSwitch<EHPersonality>(F->getName())<br>
+    .Case("__gnat_eh_personality", EHPersonality::GNU_Ada)<br>
+    .Case("__gxx_personality_v0",  EHPersonality::GNU_CXX)<br>
+    .Case("__gcc_personality_v0",  EHPersonality::GNU_C)<br>
+    .Case("__objc_personality_v0", EHPersonality::GNU_ObjC)<br>
+    .Case("__C_specific_handler",  EHPersonality::MSVC_Win64SEH)<br>
+    .Case("__CxxFrameHandler3",    EHPersonality::MSVC_CXX)<br>
+    .Default(EHPersonality::Unknown);<br>
+}<br>
<br>
Modified: llvm/trunk/lib/Transforms/InstCombine/InstructionCombining.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstructionCombining.cpp?rev=227284&r1=227283&r2=227284&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstructionCombining.cpp?rev=227284&r1=227283&r2=227284&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Transforms/InstCombine/InstructionCombining.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/InstCombine/InstructionCombining.cpp Tue Jan 27 19:17:38 2015<br>
@@ -43,6 +43,7 @@<br>
 #include "llvm/Analysis/CFG.h"<br>
 #include "llvm/Analysis/ConstantFolding.h"<br>
 #include "llvm/Analysis/InstructionSimplify.h"<br>
+#include "llvm/Analysis/LibCallSemantics.h"<br>
 #include "llvm/Analysis/LoopInfo.h"<br>
 #include "llvm/Analysis/MemoryBuiltins.h"<br>
 #include "llvm/Analysis/TargetLibraryInfo.h"<br>
@@ -2259,41 +2260,26 @@ Instruction *InstCombiner::visitExtractV<br>
   return nullptr;<br>
 }<br>
<br>
-enum Personality_Type {<br>
-  Unknown_Personality,<br>
-  GNU_Ada_Personality,<br>
-  GNU_CXX_Personality,<br>
-  GNU_ObjC_Personality<br>
-};<br>
-<br>
-/// RecognizePersonality - See if the given exception handling personality<br>
-/// function is one that we understand.  If so, return a description of it;<br>
-/// otherwise return Unknown_Personality.<br>
-static Personality_Type RecognizePersonality(Value *Pers) {<br>
-  Function *F = dyn_cast<Function>(Pers->stripPointerCasts());<br>
-  if (!F)<br>
-    return Unknown_Personality;<br>
-  return StringSwitch<Personality_Type>(F->getName())<br>
-    .Case("__gnat_eh_personality", GNU_Ada_Personality)<br>
-    .Case("__gxx_personality_v0",  GNU_CXX_Personality)<br>
-    .Case("__objc_personality_v0", GNU_ObjC_Personality)<br>
-    .Default(Unknown_Personality);<br>
-}<br>
-<br>
 /// isCatchAll - Return 'true' if the given typeinfo will match anything.<br>
-static bool isCatchAll(Personality_Type Personality, Constant *TypeInfo) {<br>
+static bool isCatchAll(EHPersonality Personality, Constant *TypeInfo) {<br>
   switch (Personality) {<br>
-  case Unknown_Personality:<br>
+  case EHPersonality::GNU_C:<br>
+    // The GCC C EH personality only exists to support cleanups, so it's not<br>
+    // clear what the semantics of catch clauses are.<br>
+    return false;<br>
+  case EHPersonality::Unknown:<br>
     return false;<br>
-  case GNU_Ada_Personality:<br>
+  case EHPersonality::GNU_Ada:<br>
     // While __gnat_all_others_value will match any Ada exception, it doesn't<br>
     // match foreign exceptions (or didn't, before gcc-4.7).<br>
     return false;<br>
-  case GNU_CXX_Personality:<br>
-  case GNU_ObjC_Personality:<br>
+  case EHPersonality::GNU_CXX:<br>
+  case EHPersonality::GNU_ObjC:<br>
+  case EHPersonality::MSVC_Win64SEH:<br>
+  case EHPersonality::MSVC_CXX:<br>
     return TypeInfo->isNullValue();<br>
   }<br>
-  llvm_unreachable("Unknown personality!");<br>
+  llvm_unreachable("invalid enum");<br>
 }<br>
<br>
 static bool shorter_filter(const Value *LHS, const Value *RHS) {<br>
@@ -2307,7 +2293,7 @@ Instruction *InstCombiner::visitLandingP<br>
   // The logic here should be correct for any real-world personality function.<br>
   // However if that turns out not to be true, the offending logic can always<br>
   // be conditioned on the personality function, like the catch-all logic is.<br>
-  Personality_Type Personality = RecognizePersonality(LI.getPersonalityFn());<br>
+  EHPersonality Personality = ClassifyEHPersonality(LI.getPersonalityFn());<br>
<br>
   // Simplify the list of clauses, eg by removing repeated catch clauses<br>
   // (these are often created by inlining).<br>
<br>
Modified: llvm/trunk/test/Transforms/InstCombine/LandingPadClauses.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/LandingPadClauses.ll?rev=227284&r1=227283&r2=227284&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/LandingPadClauses.ll?rev=227284&r1=227283&r2=227284&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/Transforms/InstCombine/LandingPadClauses.ll (original)<br>
+++ llvm/trunk/test/Transforms/InstCombine/LandingPadClauses.ll Tue Jan 27 19:17:38 2015<br>
@@ -7,6 +7,7 @@<br>
 declare i32 @generic_personality(i32, i64, i8*, i8*)<br>
 declare i32 @__gxx_personality_v0(i32, i64, i8*, i8*)<br>
 declare i32 @__objc_personality_v0(i32, i64, i8*, i8*)<br>
+declare i32 @__C_specific_handler(...)<br>
<br>
 declare void @bar()<br>
<br>
@@ -227,6 +228,57 @@ lpad.d:<br>
           cleanup<br>
           catch i32* null<br>
   unreachable<br>
+; CHECK: %d = landingpad<br>
+; CHECK-NEXT: null<br>
+; CHECK-NEXT: unreachable<br>
+}<br>
+<br>
+define void @foo_seh() {<br>
+; CHECK-LABEL: @foo_seh(<br>
+  invoke void @bar()<br>
+    to label %cont.a unwind label %lpad.a<br>
+cont.a:<br>
+  invoke void @bar()<br>
+    to label %cont.b unwind label %lpad.b<br>
+cont.b:<br>
+  invoke void @bar()<br>
+    to label %cont.c unwind label %lpad.c<br>
+cont.c:<br>
+  invoke void @bar()<br>
+    to label %cont.d unwind label %lpad.d<br>
+cont.d:<br>
+  ret void<br>
+<br>
+lpad.a:<br>
+  %a = landingpad { i8*, i32 } personality i32 (...)* @__C_specific_handler<br>
+          catch i32* null<br>
+          catch i32* @T1<br>
+  unreachable<br>
+; CHECK: %a = landingpad<br>
+; CHECK-NEXT: null<br>
+; CHECK-NEXT: unreachable<br>
+<br>
+lpad.b:<br>
+  %b = landingpad { i8*, i32 } personality i32 (...)* @__C_specific_handler<br>
+          filter [1 x i32*] zeroinitializer<br>
+  unreachable<br>
+; CHECK: %b = landingpad<br>
+; CHECK-NEXT: cleanup<br>
+; CHECK-NEXT: unreachable<br>
+<br>
+lpad.c:<br>
+  %c = landingpad { i8*, i32 } personality i32 (...)* @__C_specific_handler<br>
+          filter [2 x i32*] [i32* @T1, i32* null]<br>
+  unreachable<br>
+; CHECK: %c = landingpad<br>
+; CHECK-NEXT: cleanup<br>
+; CHECK-NEXT: unreachable<br>
+<br>
+lpad.d:<br>
+  %d = landingpad { i8*, i32 } personality i32 (...)* @__C_specific_handler<br>
+          cleanup<br>
+          catch i32* null<br>
+  unreachable<br>
 ; CHECK: %d = landingpad<br>
 ; CHECK-NEXT: null<br>
 ; CHECK-NEXT: unreachable<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div>