mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 04:30:23 +00:00
For PR797:
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
This commit is contained in:
parent
f3e4f0e615
commit
99655e16a6
@ -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
|
||||
|
@ -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
|
||||
|
@ -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.
|
||||
|
@ -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.
|
||||
|
@ -9,7 +9,6 @@
|
||||
LEVEL = ../../..
|
||||
LIBRARYNAME = LLVMBCReader
|
||||
BUILD_ARCHIVE = 1
|
||||
REQUIRES_EH := 1
|
||||
|
||||
include $(LEVEL)/Makefile.common
|
||||
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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.
|
||||
|
Loading…
Reference in New Issue
Block a user