[llvm-commits] [llvm] r92020 - in /llvm/trunk/lib/System: DynamicLibrary.cpp DynamicLibrarySymbolDefs.def

Douglas Gregor dgregor at apple.com
Wed Dec 23 10:56:28 PST 2009


Author: dgregor
Date: Wed Dec 23 12:56:27 2009
New Revision: 92020

URL: http://llvm.org/viewvc/llvm-project?rev=92020&view=rev
Log:
Move the extern symbol declarations outside of
DynamicLibrary::SearchForAddressOfSymbol and force them to have "C"
linkage. 

Interestingly, GCC treats the block-scoped "extern" declarations we
previously had as if they were extern "C" declarations (or, at least,
were in the global namespace), so that GCC bug papered over this LLVM
bug. Clang and EDG get the linkage correct; this new variant seems to
work for both GCC and Clang.

Added:
    llvm/trunk/lib/System/DynamicLibrarySymbolDefs.def
Modified:
    llvm/trunk/lib/System/DynamicLibrary.cpp

Modified: llvm/trunk/lib/System/DynamicLibrary.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/DynamicLibrary.cpp?rev=92020&r1=92019&r2=92020&view=diff

==============================================================================
--- llvm/trunk/lib/System/DynamicLibrary.cpp (original)
+++ llvm/trunk/lib/System/DynamicLibrary.cpp Wed Dec 23 12:56:27 2009
@@ -69,6 +69,10 @@
   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 @@
   }
 
 #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) \

Added: llvm/trunk/lib/System/DynamicLibrarySymbolDefs.def
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/DynamicLibrarySymbolDefs.def?rev=92020&view=auto

==============================================================================
--- llvm/trunk/lib/System/DynamicLibrarySymbolDefs.def (added)
+++ llvm/trunk/lib/System/DynamicLibrarySymbolDefs.def Wed Dec 23 12:56:27 2009
@@ -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





More information about the llvm-commits mailing list