[llvm-commits] [llvm-gcc-4.2] r41563 - in /llvm-gcc-4.2/trunk/gcc: cp/except.c except.c except.h llvm-convert.cpp

Duncan Sands baldrick at free.fr
Wed Aug 29 07:34:37 PDT 2007


Author: baldrick
Date: Wed Aug 29 09:34:36 2007
New Revision: 41563

URL: http://llvm.org/viewvc/llvm-project?rev=41563&view=rev
Log:
Let languages specify how to add a catch-all to the
end of an eh_selector call.

Modified:
    llvm-gcc-4.2/trunk/gcc/cp/except.c
    llvm-gcc-4.2/trunk/gcc/except.c
    llvm-gcc-4.2/trunk/gcc/except.h
    llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp

Modified: llvm-gcc-4.2/trunk/gcc/cp/except.c
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/cp/except.c?rev=41563&r1=41562&r2=41563&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/cp/except.c (original)
+++ llvm-gcc-4.2/trunk/gcc/cp/except.c Wed Aug 29 09:34:36 2007
@@ -56,6 +56,16 @@
 static int can_convert_eh (tree, tree);
 static tree cp_protect_cleanup_actions (void);
 
+/* LLVM local begin */
+/* Do nothing (return NULL_TREE).  */
+
+tree
+return_null_tree (void)
+{
+  return NULL_TREE;
+}
+/* LLVM local end */
+
 /* Sets up all the global eh stuff that needs to be initialized at the
    start of compilation.  */
 
@@ -92,6 +102,8 @@
 
   lang_eh_runtime_type = build_eh_type_type;
   lang_protect_cleanup_actions = &cp_protect_cleanup_actions;
+  /* LLVM local */
+  lang_eh_catch_all = return_null_tree;
 }
 
 /* Returns an expression to be executed if an unhandled exception is

Modified: llvm-gcc-4.2/trunk/gcc/except.c
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/except.c?rev=41563&r1=41562&r2=41563&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/except.c (original)
+++ llvm-gcc-4.2/trunk/gcc/except.c Wed Aug 29 09:34:36 2007
@@ -95,6 +95,11 @@
 /* Map a type to a runtime object to match type.  */
 tree (*lang_eh_runtime_type) (tree);
 
+/* LLVM local begin */
+/* Return a type that catches all others */
+tree (*lang_eh_catch_all) (void);
+/* LLVM local end */
+
 /* A hash table of label to region number.  */
 
 struct ehl_map_entry GTY(())

Modified: llvm-gcc-4.2/trunk/gcc/except.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/except.h?rev=41563&r1=41562&r2=41563&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/except.h (original)
+++ llvm-gcc-4.2/trunk/gcc/except.h Wed Aug 29 09:34:36 2007
@@ -139,6 +139,13 @@
 /* Map a type to a runtime object to match type.  */
 extern tree (*lang_eh_runtime_type) (tree);
 
+/* LLVM local begin */
+/* If non-NULL, this function returns a type that covers all others,
+   a "catch-all" type.  It may also return NULL_TREE, indicating that
+   the null runtime object catches all types, as in C++.  */
+extern tree (*lang_eh_catch_all) (void);
+/* LLVM local end */
+
 
 /* Just because the user configured --with-sjlj-exceptions=no doesn't
    mean that we can use call frame exceptions.  Detect that the target

Modified: llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp?rev=41563&r1=41562&r2=41563&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp Wed Aug 29 09:34:36 2007
@@ -1840,12 +1840,27 @@
       }
     }
 
-    if (can_throw_external_1(i, false))
+    if (can_throw_external_1(i, false)) {
       // Some exceptions from this region may not be caught by any handler.
       // Since invokes are required to branch to the unwind label no matter
       // what exception is being unwound, append a catch-all.
-      // FIXME: The use of null as catch-all is C++ specific.
-      Args.push_back(Constant::getNullValue(PointerType::get(Type::Int8Ty)));
+
+      // The representation of a catch-all is language specific.
+      Value *Catch_All;
+      if (!lang_eh_catch_all) {
+        // Use a "cleanup" - this should be good enough for most languages.
+        Catch_All = ConstantInt::get(Type::Int32Ty, 0);
+      } else {
+        tree catch_all_type = lang_eh_catch_all();
+        if (catch_all_type == NULL_TREE)
+          // Use a C++ style null catch-all object.
+          Catch_All = Constant::getNullValue(PointerType::get(Type::Int8Ty));
+        else
+          // This language has a type that catches all others.
+          Catch_All = Emit(lookup_type_for_runtime(catch_all_type), 0);
+      }
+      Args.push_back(Catch_All);
+    }
 
     // Emit the selector call.
     Value *Select = Builder.CreateCall(FuncEHSelector, Args.begin(), Args.end(),





More information about the llvm-commits mailing list