aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/System/DynamicLibrary.cpp34
-rw-r--r--lib/System/DynamicLibrarySymbolDefs.def41
2 files changed, 47 insertions, 28 deletions
diff --git a/lib/System/DynamicLibrary.cpp b/lib/System/DynamicLibrary.cpp
index 7eb9f5f3ef..b511a3cad2 100644
--- a/lib/System/DynamicLibrary.cpp
+++ b/lib/System/DynamicLibrary.cpp
@@ -69,6 +69,10 @@ bool DynamicLibrary::LoadLibraryPermanently(const char *Filename,
return false;
}
+#define EXPLICIT_SYMBOL(SYM) \
+ extern "C" void *SYM;
+#include "DynamicLibrarySymbolDefs.def"
+
void* DynamicLibrary::SearchForAddressOfSymbol(const char* symbolName) {
// First check symbols added via AddSymbol().
if (ExplicitSymbols) {
@@ -93,41 +97,15 @@ void* DynamicLibrary::SearchForAddressOfSymbol(const char* symbolName) {
}
#define EXPLICIT_SYMBOL(SYM) \
- extern void *SYM; if (!strcmp(symbolName, #SYM)) return &SYM
+ if (!strcmp(symbolName, #SYM)) return &SYM;
// If this is darwin, it has some funky issues, try to solve them here. Some
// important symbols are marked 'private external' which doesn't allow
// SearchForAddressOfSymbol to find them. As such, we special case them here,
// there is only a small handful of them.
-
-#ifdef __APPLE__
- {
- EXPLICIT_SYMBOL(__ashldi3);
- EXPLICIT_SYMBOL(__ashrdi3);
- EXPLICIT_SYMBOL(__cmpdi2);
- EXPLICIT_SYMBOL(__divdi3);
- EXPLICIT_SYMBOL(__eprintf);
- EXPLICIT_SYMBOL(__fixdfdi);
- EXPLICIT_SYMBOL(__fixsfdi);
- EXPLICIT_SYMBOL(__fixunsdfdi);
- EXPLICIT_SYMBOL(__fixunssfdi);
- EXPLICIT_SYMBOL(__floatdidf);
- EXPLICIT_SYMBOL(__floatdisf);
- EXPLICIT_SYMBOL(__lshrdi3);
- EXPLICIT_SYMBOL(__moddi3);
- EXPLICIT_SYMBOL(__udivdi3);
- EXPLICIT_SYMBOL(__umoddi3);
- }
-#endif
-
-#ifdef __CYGWIN__
{
- EXPLICIT_SYMBOL(_alloca);
- EXPLICIT_SYMBOL(__main);
+#include "DynamicLibrarySymbolDefs.def"
}
-#endif
-
-#undef EXPLICIT_SYMBOL
// This macro returns the address of a well-known, explicit symbol
#define EXPLICIT_SYMBOL(SYM) \
diff --git a/lib/System/DynamicLibrarySymbolDefs.def b/lib/System/DynamicLibrarySymbolDefs.def
new file mode 100644
index 0000000000..c012916534
--- /dev/null
+++ b/lib/System/DynamicLibrarySymbolDefs.def
@@ -0,0 +1,41 @@
+//===-- DynamicLibrarySymbolDefs.def - Extra symbol definitions -*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file enumerates the set of extra external symbol definitions needed for
+// dynamic libraries.
+//
+//===----------------------------------------------------------------------===//
+#ifndef EXPLICIT_SYMBOL
+# error Must define EXPLICIT_SYMBOL to include this definitions file
+#endif
+
+#ifdef __APPLE__
+EXPLICIT_SYMBOL(__ashldi3)
+EXPLICIT_SYMBOL(__ashrdi3)
+EXPLICIT_SYMBOL(__cmpdi2)
+EXPLICIT_SYMBOL(__divdi3)
+EXPLICIT_SYMBOL(__eprintf)
+EXPLICIT_SYMBOL(__fixdfdi)
+EXPLICIT_SYMBOL(__fixsfdi)
+EXPLICIT_SYMBOL(__fixunsdfdi)
+EXPLICIT_SYMBOL(__fixunssfdi)
+EXPLICIT_SYMBOL(__floatdidf)
+EXPLICIT_SYMBOL(__floatdisf)
+EXPLICIT_SYMBOL(__lshrdi3)
+EXPLICIT_SYMBOL(__moddi3)
+EXPLICIT_SYMBOL(__udivdi3)
+EXPLICIT_SYMBOL(__umoddi3)
+#endif
+
+#ifdef __CYGWIN__
+EXPLICIT_SYMBOL(_alloca)
+EXPLICIT_SYMBOL(__main)
+#endif
+
+#undef EXPLICIT_SYMBOL