For PR797:
authorReid Spencer <rspencer@reidspencer.com>
Fri, 25 Aug 2006 19:54:53 +0000 (19:54 +0000)
committerReid Spencer <rspencer@reidspencer.com>
Fri, 25 Aug 2006 19:54:53 +0000 (19:54 +0000)
Final commit for this bug. This removes the last EH holdouts in LLVM
and turns off exception support by using the -fno-exceptions option. This
leads to the following reduction in library and executable sizes:
                DEBUG BUILD                RELEASE BUILD
         before     after   delta     before   after    delta
lib    162,328K  157,616K   4,712    17,864K  16,416K  1,448K
bin    571,444K  557,156K  14,288    63,296K   56,996K 6,300K

Debug   Improvement: 19,000K (2.59%)
Release Improvement:  7,748K (9.55%)

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@29882 91177308-0d34-0410-b5e6-96231b3b80d8

Makefile.rules
include/llvm/System/DynamicLibrary.h
lib/Archive/Makefile
lib/Bytecode/Archive/Makefile
lib/Bytecode/Reader/Makefile
lib/Bytecode/Reader/Reader.cpp
lib/Bytecode/Reader/Reader.h
lib/System/DynamicLibrary.cpp
lib/System/README.txt

index 808e2b5a7615ed4dcbe3a8867e4a2b84a90f933c..88fa992c51178cc28c08c46eb5eed16c19617362 100644 (file)
@@ -206,11 +206,6 @@ else
   OPTIMIZE_OPTION := -O2
 endif
 
-# IF REQUIRES_EH=1 is specified then don't disable exceptions
-#ifndef REQUIRES_EH
-#  CXX.Flags += -fno-exceptions
-#endif
-
 ifdef ENABLE_PROFILING
   BuildMode := Profile
   CXX.Flags := $(OPTIMIZE_OPTION) -pg -g
@@ -243,6 +238,11 @@ else
   endif
 endif
 
+# IF REQUIRES_EH=1 is specified then don't disable exceptions
+#ifndef REQUIRES_EH
+#  CXX.Flags += -fno-exceptions
+#endif
+
 # If DISABLE_ASSERTIONS=1 is specified (make command line or configured),
 # then disable assertions by defining the appropriate preprocessor symbols.
 ifdef DISABLE_ASSERTIONS
index fc1bfbe1fba62b9c87c744a2875ab87287b5eaf8..5499f9dceab7b8801fef0adb8a82f607de39f19b 100644 (file)
@@ -45,12 +45,6 @@ namespace sys {
       /// @brief Open program as dynamic library.
       DynamicLibrary();
 
-      /// This is the constructor for DynamicLibrary instances. It will open
-      /// the dynamic library specified by the filename Path.
-      /// @throws std::string indicating why the library couldn't be opened.
-      /// @brief Open a dynamic library.
-      DynamicLibrary(const char* filename);
-
       /// After destruction, the symbols of the library will no longer be
       /// available to the program. It is important to make sure the lifespan
       /// of a DynamicLibrary exceeds the lifetime of the pointers returned
index 39712b555f46f25e59f9ee1656008218f70758dd..0ecf38b93f02794a175cb66ddf97dd31cbb45e60 100644 (file)
@@ -9,7 +9,6 @@
 
 LEVEL = ../../..
 LIBRARYNAME = LLVMArchive
-REQUIRES_EH := 1
 
 # We only want an archive so only those modules actually used by a tool are 
 # included.
index 39712b555f46f25e59f9ee1656008218f70758dd..0ecf38b93f02794a175cb66ddf97dd31cbb45e60 100644 (file)
@@ -9,7 +9,6 @@
 
 LEVEL = ../../..
 LIBRARYNAME = LLVMArchive
-REQUIRES_EH := 1
 
 # We only want an archive so only those modules actually used by a tool are 
 # included.
index 989eba74088387ba0b9f7699d576a542da536a0a..a86d008715f37fbacf0d90fca4ef9a2e3c45f9ba 100644 (file)
@@ -9,7 +9,6 @@
 LEVEL = ../../..
 LIBRARYNAME = LLVMBCReader
 BUILD_ARCHIVE = 1
-REQUIRES_EH := 1
 
 include $(LEVEL)/Makefile.common
 
index 4a0685b9f3bf8c3b49fd270764818add6d10ae1e..7b42fee9154bdf6428a74db351e73ff24c0631dd 100644 (file)
@@ -1943,14 +1943,18 @@ void BytecodeReader::ParseFunctionLazily() {
 /// ParseAllFunctionBodies.
 /// @see ParseAllFunctionBodies
 /// @see ParseBytecode
-void BytecodeReader::ParseFunction(Function* Func) {
+bool BytecodeReader::ParseFunction(Function* Func, std::string* ErrMsg) {
+
+  if (setjmp(context))
+    return true;
+
   // Find {start, end} pointers and slot in the map. If not there, we're done.
   LazyFunctionMap::iterator Fi = LazyFunctionLoadMap.find(Func);
 
   // Make sure we found it
   if (Fi == LazyFunctionLoadMap.end()) {
     error("Unrecognized function of type " + Func->getType()->getDescription());
-    return;
+    return true;
   }
 
   BlockStart = At = Fi->second.Buf;
@@ -1960,6 +1964,7 @@ void BytecodeReader::ParseFunction(Function* Func) {
   LazyFunctionLoadMap.erase(Fi);
 
   this->ParseFunctionBody(Func);
+  return false;
 }
 
 /// The ParseAllFunctionBodies method parses through all the previously
@@ -1969,7 +1974,10 @@ void BytecodeReader::ParseFunction(Function* Func) {
 /// the function definitions are located. This function uses that information
 /// to materialize the functions.
 /// @see ParseBytecode
-void BytecodeReader::ParseAllFunctionBodies() {
+bool BytecodeReader::ParseAllFunctionBodies(std::string* ErrMsg) {
+  if (setjmp(context))
+    return true;
+
   LazyFunctionMap::iterator Fi = LazyFunctionLoadMap.begin();
   LazyFunctionMap::iterator Fe = LazyFunctionLoadMap.end();
 
@@ -1981,7 +1989,7 @@ void BytecodeReader::ParseAllFunctionBodies() {
     ++Fi;
   }
   LazyFunctionLoadMap.clear();
-
+  return false;
 }
 
 /// Parse the global type list
index 37dd1d73ff869c339db28ae7f82eebf088cce954..711dc89f4c28c47fe526bdc73b66d7f6544e776d 100644 (file)
@@ -147,26 +147,21 @@ public:
   );
 
   /// @brief Parse all function bodies
-  void ParseAllFunctionBodies();
+  bool ParseAllFunctionBodies(std::string* ErrMsg);
 
   /// @brief Parse the next function of specific type
-  void ParseFunction(Function* Func) ;
+  bool ParseFunction(Function* Func, std::string* ErrMsg) ;
 
   /// This method is abstract in the parent ModuleProvider class. Its
   /// implementation is identical to the ParseFunction method.
   /// @see ParseFunction
   /// @brief Make a specific function materialize.
-  virtual bool materializeFunction(Function *F, std::string *ErrInfo = 0) {
+  virtual bool materializeFunction(Function *F, std::string *ErrMsg = 0) {
     LazyFunctionMap::iterator Fi = LazyFunctionLoadMap.find(F);
-    if (Fi == LazyFunctionLoadMap.end()) return false;
-    try {
-      ParseFunction(F);
-    } catch (std::string &ErrStr) {
-      if (ErrInfo) *ErrInfo = ErrStr;
+    if (Fi == LazyFunctionLoadMap.end()) 
+      return false;
+    if (ParseFunction(F,ErrMsg))
       return true;
-    } catch (...) {
-      return true;
-    }
     return false;
   }
 
@@ -174,15 +169,9 @@ public:
   /// implementation is identical to ParseAllFunctionBodies.
   /// @see ParseAllFunctionBodies
   /// @brief Make the whole module materialize
-  virtual Module* materializeModule(std::string *ErrInfo = 0) {
-    try {
-      ParseAllFunctionBodies();
-    } catch (std::string &ErrStr) {
-      if (ErrInfo) *ErrInfo = ErrStr;
+  virtual Module* materializeModule(std::string *ErrMsg = 0) {
+    if (ParseAllFunctionBodies(ErrMsg))
       return 0;
-    } catch (...) {
-      return 0;
-    }
     return TheModule;
   }
 
index 859092a52af2ac15b69b93d6cb23bc2a8b010ab7..08b7a88cbb3d5f572cd4b12c6464536e198f2bf4 100644 (file)
@@ -45,12 +45,10 @@ using namespace llvm::sys;
 //===          independent code.
 //===----------------------------------------------------------------------===//
 
-static bool did_initialize_ltdl = false;
-
 static inline void check_ltdl_initialization() {
+  static bool did_initialize_ltdl = false;
   if (!did_initialize_ltdl) {
-    if (0 != lt_dlinit())
-      throw std::string(lt_dlerror());
+    assert(0 == lt_dlinit() || "Can't init the ltdl library");
     did_initialize_ltdl = true;
   }
 }
@@ -62,13 +60,13 @@ DynamicLibrary::DynamicLibrary() : handle(0) {
 
   lt_dlhandle a_handle = lt_dlopen(0);
 
-  if (a_handle == 0)
-    throw std::string("Can't open program as dynamic library");
+  assert(a_handle == 0 || "Can't open program as dynamic library");
 
   handle = a_handle;
   OpenedHandles.push_back(a_handle);
 }
 
+/*
 DynamicLibrary::DynamicLibrary(const char*filename) : handle(0) {
   check_ltdl_initialization();
 
@@ -83,6 +81,7 @@ DynamicLibrary::DynamicLibrary(const char*filename) : handle(0) {
   handle = a_handle;
   OpenedHandles.push_back(a_handle);
 }
+*/
 
 DynamicLibrary::~DynamicLibrary() {
   lt_dlhandle a_handle = (lt_dlhandle) handle;
index 63e00dafbfbaba10123bc6159df3aca4629930d3..eacb20094a61b1e8baf065a2ce24b26e1db6d7d4 100644 (file)
@@ -25,8 +25,8 @@ impatient, here's a high level summary of the library's requirements.
  3. No exposed system-specific functions.
  4. No exposed system-specific data.
  5. Data in lib/System classes must use only simple C++ intrinsic types.
- 6. Errors are handled by throwing std::string *only*.
- 7. Library must not throw any exceptions except std::string.
+ 6. Errors are handled by returning "true" and setting an optional std::string
+ 7. Library must not throw any exceptions, period.
  8. Interface functions must not have throw() specifications.
  9. No duplicate function impementations are permitted within an operating
     system class.