Roll r96559 forward again, adding libLLVM-2.7svn.so to LLVM. This links 3 of
authorJeffrey Yasskin <jyasskin@google.com>
Tue, 23 Feb 2010 18:10:07 +0000 (18:10 +0000)
committerJeffrey Yasskin <jyasskin@google.com>
Tue, 23 Feb 2010 18:10:07 +0000 (18:10 +0000)
the examples shared to make sure the shared library keeps working.

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

13 files changed:
Makefile
Makefile.config.in
Makefile.rules
autoconf/configure.ac
configure
examples/BrainF/Makefile
examples/Fibonacci/Makefile
examples/HowToUseJIT/Makefile
test/Makefile
test/Unit/lit.cfg
test/Unit/lit.site.cfg.in
tools/llvm-shlib/Makefile [new file with mode: 0644]
unittests/Makefile.unittest

index 20395e9470d006ef75b7234c193d9ef05c78f4e2..f76f6b77bd2f673171743fd29c10a5456bd86537 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -30,8 +30,8 @@ ifeq ($(BUILD_DIRS_ONLY),1)
   DIRS := lib/System lib/Support utils
   OPTIONAL_DIRS :=
 else
-  DIRS := lib/System lib/Support utils lib/VMCore lib tools/llvm-config \
-          tools runtime docs unittests
+  DIRS := lib/System lib/Support utils lib/VMCore lib tools/llvm-shlib \
+          tools/llvm-config tools runtime docs unittests
   OPTIONAL_DIRS := projects bindings
 endif
 
index 5d8645fef98f843c529d47377f15f17c3e1563b7..d59c81b8315587f102e8649cfd6b421c8f33d241 100644 (file)
@@ -262,6 +262,11 @@ ENABLE_THREADS := @ENABLE_THREADS@
 # Do we want to build with position independent code?
 ENABLE_PIC := @ENABLE_PIC@
 
+# Do we want to link the tools shared?
+ifndef ENABLE_SHARED
+  ENABLE_SHARED := @ENABLE_SHARED@
+endif
+
 # Use -fvisibility-inlines-hidden?
 ENABLE_VISIBILITY_INLINES_HIDDEN := @ENABLE_VISIBILITY_INLINES_HIDDEN@
 
@@ -272,6 +277,9 @@ ENABLE_VISIBILITY_INLINES_HIDDEN := @ENABLE_VISIBILITY_INLINES_HIDDEN@
 # Enable JIT for this platform
 TARGET_HAS_JIT = @TARGET_HAS_JIT@
 
+# Environment variable to set to change the runtime shared library search path.
+SHLIBPATH_VAR = @SHLIBPATH_VAR@
+
 # Shared library extension for host platform.
 SHLIBEXT = @SHLIBEXT@
 
index db52985179fd13e0948cb9fab375824c38a0ceb2..b5b35256b794143034e3dae0f7a7b76ba5719199 100644 (file)
@@ -623,11 +623,12 @@ endif
 ifneq ($(HOST_OS),Darwin)
 ifneq ($(DARWIN_MAJVERS),4)
 ifdef TOOLNAME
-ifdef EXAMPLE_TOOL
-  LD.Flags += $(RPATH) -Wl,$(ExmplDir) $(RDYNAMIC)
-else
-  LD.Flags += $(RPATH) -Wl,$(ToolDir) $(RDYNAMIC)
-endif
+  LD.Flags += $(RPATH) -Wl,'$$ORIGIN/../lib'
+  ifdef EXAMPLE_TOOL
+    LD.Flags += $(RPATH) -Wl,$(ExmplDir) $(RDYNAMIC)
+  else
+    LD.Flags += $(RPATH) -Wl,$(ToolDir) $(RDYNAMIC)
+  endif
 endif
 endif
 endif
@@ -960,11 +961,16 @@ $(LLVM_CONFIG):
 
 $(ToolDir)/$(strip $(TOOLNAME))$(EXEEXT): $(LLVM_CONFIG)
 
+ifeq ($(ENABLE_SHARED), 1)
+LLVMLibsOptions += -lLLVM-$(LLVMVersion)
+LLVMLibsPaths += $(LibDir)/libLLVM-$(LLVMVersion)$(SHLIBEXT)
+else
 LLVMLibsOptions += $(shell $(LLVM_CONFIG) --libs     $(LINK_COMPONENTS))
 LLVMLibsPaths   += $(LLVM_CONFIG) \
                    $(shell $(LLVM_CONFIG) --libfiles $(LINK_COMPONENTS))
 endif
 endif
+endif
 
 ###############################################################################
 # Library Build Rules: Four ways to build a library
@@ -1169,11 +1175,13 @@ endif
 #   If neither BUILD_ARCHIVE or LOADABLE_MODULE are specified, default to
 #   building an archive.
 #---------------------------------------------------------
+ifndef NO_BUILD_ARCHIVE
 ifndef BUILD_ARCHIVE
 ifndef LOADABLE_MODULE
 BUILD_ARCHIVE = 1
 endif
 endif
+endif
 
 #---------------------------------------------------------
 # Archive Library Targets:
index 9e8cdfc2262b0c11a474c5754b5c2f2e9b413bb3..a4ba7a4af2d5d06d7fe60cbd9c9d2bbd5161f0ca 100644 (file)
@@ -470,6 +470,18 @@ esac
 AC_DEFINE_UNQUOTED([ENABLE_PIC],$ENABLE_PIC,
                    [Define if position independent code is enabled])
 
+dnl Allow linking tools against the shared library.
+AC_ARG_ENABLE(shared,
+  AS_HELP_STRING([--enable-shared],
+                 [Link LLVM tools shared (default is NO)]),,
+                 enableval=default)
+case "$enableval" in
+  yes) AC_SUBST(ENABLE_SHARED,[1]) ;;
+  no)  AC_SUBST(ENABLE_SHARED,[0]) ;;
+  default) AC_SUBST(ENABLE_SHARED,[0]) ;;
+  *) AC_MSG_ERROR([Invalid setting for --enable-shared. Use "yes" or "no"]) ;;
+esac
+
 dnl Allow specific targets to be specified for building (or not)
 TARGETS_TO_BUILD=""
 AC_ARG_ENABLE([targets],AS_HELP_STRING([--enable-targets],
@@ -1332,6 +1344,10 @@ dnl Propagate the shared library extension that the libltdl checks did to
 dnl the Makefiles so we can use it there too
 AC_SUBST(SHLIBEXT,$libltdl_cv_shlibext)
 
+dnl Propagate the run-time library path variable that the libltdl
+dnl checks found to the Makefiles so we can use it there too
+AC_SUBST(SHLIBPATH_VAR,$libltdl_cv_shlibpath_var)
+
 # Translate the various configuration directories and other basic
 # information into substitutions that will end up in Makefile.config.in
 # that these configured values can be used by the makefiles
index 54bdf0cd1450fb99d32ea8be48152180b15dca68..877231a99adbad00c9690e6cdff52c54d88f6762 100755 (executable)
--- a/configure
+++ b/configure
@@ -689,6 +689,7 @@ TARGET_HAS_JIT
 ENABLE_DOXYGEN
 ENABLE_THREADS
 ENABLE_PIC
+ENABLE_SHARED
 TARGETS_TO_BUILD
 LLVM_ENUM_TARGETS
 LLVM_ENUM_ASM_PRINTERS
@@ -770,6 +771,7 @@ LLVMCC1PLUS
 LLVMGCCDIR
 LLVMGCC_LANGS
 SHLIBEXT
+SHLIBPATH_VAR
 LLVM_PREFIX
 LLVM_BINDIR
 LLVM_LIBDIR
@@ -1402,6 +1404,7 @@ Optional Features:
   --enable-threads        Use threads if available (default is YES)
   --enable-pic            Build LLVM with Position Independent Code (default
                           is YES)
+  --enable-shared         Link LLVM tools shared (default is NO)
   --enable-targets        Build specific host targets: all or
                           target1,target2,... Valid targets are: host, x86,
                           x86_64, sparc, powerpc, alpha, arm, mips, spu,
@@ -4864,6 +4867,25 @@ cat >>confdefs.h <<_ACEOF
 _ACEOF
 
 
+# Check whether --enable-shared was given.
+if test "${enable_shared+set}" = set; then
+  enableval=$enable_shared;
+else
+  enableval=default
+fi
+
+case "$enableval" in
+  yes) ENABLE_SHARED=1
+ ;;
+  no)  ENABLE_SHARED=0
+ ;;
+  default) ENABLE_SHARED=0
+ ;;
+  *) { { echo "$as_me:$LINENO: error: Invalid setting for --enable-shared. Use \"yes\" or \"no\"" >&5
+echo "$as_me: error: Invalid setting for --enable-shared. Use \"yes\" or \"no\"" >&2;}
+   { (exit 1); exit 1; }; } ;;
+esac
+
 TARGETS_TO_BUILD=""
 # Check whether --enable-targets was given.
 if test "${enable_targets+set}" = set; then
@@ -11105,7 +11127,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<EOF
-#line 11108 "configure"
+#line 11130 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -19686,6 +19708,9 @@ fi
 SHLIBEXT=$libltdl_cv_shlibext
 
 
+SHLIBPATH_VAR=$libltdl_cv_shlibpath_var
+
+
 # Translate the various configuration directories and other basic
 # information into substitutions that will end up in Makefile.config.in
 # that these configured values can be used by the makefiles
@@ -20743,6 +20768,7 @@ TARGET_HAS_JIT!$TARGET_HAS_JIT$ac_delim
 ENABLE_DOXYGEN!$ENABLE_DOXYGEN$ac_delim
 ENABLE_THREADS!$ENABLE_THREADS$ac_delim
 ENABLE_PIC!$ENABLE_PIC$ac_delim
+ENABLE_SHARED!$ENABLE_SHARED$ac_delim
 TARGETS_TO_BUILD!$TARGETS_TO_BUILD$ac_delim
 LLVM_ENUM_TARGETS!$LLVM_ENUM_TARGETS$ac_delim
 LLVM_ENUM_ASM_PRINTERS!$LLVM_ENUM_ASM_PRINTERS$ac_delim
@@ -20752,7 +20778,6 @@ ENABLE_CBE_PRINTF_A!$ENABLE_CBE_PRINTF_A$ac_delim
 CLANGPATH!$CLANGPATH$ac_delim
 CLANGXXPATH!$CLANGXXPATH$ac_delim
 ENABLE_BUILT_CLANG!$ENABLE_BUILT_CLANG$ac_delim
-OPTIMIZE_OPTION!$OPTIMIZE_OPTION$ac_delim
 _ACEOF
 
   if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then
@@ -20794,6 +20819,7 @@ _ACEOF
 ac_delim='%!_!# '
 for ac_last_try in false false false false false :; do
   cat >conf$$subs.sed <<_ACEOF
+OPTIMIZE_OPTION!$OPTIMIZE_OPTION$ac_delim
 EXTRA_OPTIONS!$EXTRA_OPTIONS$ac_delim
 BINUTILS_INCDIR!$BINUTILS_INCDIR$ac_delim
 ENABLE_LLVMC_DYNAMIC!$ENABLE_LLVMC_DYNAMIC$ac_delim
@@ -20865,6 +20891,7 @@ LLVMCC1PLUS!$LLVMCC1PLUS$ac_delim
 LLVMGCCDIR!$LLVMGCCDIR$ac_delim
 LLVMGCC_LANGS!$LLVMGCC_LANGS$ac_delim
 SHLIBEXT!$SHLIBEXT$ac_delim
+SHLIBPATH_VAR!$SHLIBPATH_VAR$ac_delim
 LLVM_PREFIX!$LLVM_PREFIX$ac_delim
 LLVM_BINDIR!$LLVM_BINDIR$ac_delim
 LLVM_LIBDIR!$LLVM_LIBDIR$ac_delim
@@ -20885,7 +20912,7 @@ LIBOBJS!$LIBOBJS$ac_delim
 LTLIBOBJS!$LTLIBOBJS$ac_delim
 _ACEOF
 
-  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 89; then
+  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 91; then
     break
   elif $ac_last_try; then
     { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
index 2c3e0662523d4fe97f5190ed3fc4d2e2a9455c63..2e2cb6d1ae03a4978b4c9b9077e94f53ea497be6 100644 (file)
@@ -9,6 +9,9 @@
 LEVEL = ../..
 TOOLNAME = BrainF
 EXAMPLE_TOOL = 1
+# To keep the shared library working, we link a few of the examples
+# against it unconditionally.
+ENABLE_SHARED = 1
 
 LINK_COMPONENTS := jit bitwriter nativecodegen interpreter
 
index 71f6ba0ef52ed18e891f8f4112e984661391c232..d89119add7be1ad88b150f9a269ffb77444e8924 100644 (file)
@@ -10,6 +10,9 @@
 LEVEL = ../..
 TOOLNAME = Fibonacci
 EXAMPLE_TOOL = 1
+# To keep the shared library working, we link a few of the examples
+# against it unconditionally.
+ENABLE_SHARED = 1
 
 # Link in JIT support
 LINK_COMPONENTS := jit interpreter nativecodegen
index c8919db90cc2e1f18b44a08b547e4b7344112276..c61e9e12b852de8343882021d2e55738d406782f 100644 (file)
@@ -9,6 +9,9 @@
 LEVEL = ../..
 TOOLNAME = HowToUseJIT
 EXAMPLE_TOOL = 1
+# To keep the shared library working, we link a few of the examples
+# against it unconditionally.
+ENABLE_SHARED = 1
 
 LINK_COMPONENTS := jit interpreter nativecodegen
 
index 1ae54f45e330bf2527d4516bfe4bebe60e07bee2..3750fdb2f1d093e7c31057abd4c3f01a0d94b640 100644 (file)
@@ -198,4 +198,6 @@ Unit/lit.site.cfg: $(PROJ_OBJ_DIR)/Unit/.dir FORCE
             -e "s#@LLVM_TOOLS_DIR@#$(ToolDir)#g" \
             -e "s#@LLVMGCCDIR@#$(LLVMGCCDIR)#g" \
             -e "s#@LLVM_BUILD_MODE@#$(BuildMode)#g" \
+            -e "s#@ENABLE_SHARED@#$(ENABLE_SHARED)#g" \
+            -e "s#@SHLIBPATH_VAR@#$(SHLIBPATH_VAR)#g" \
             $(PROJ_SRC_DIR)/Unit/lit.site.cfg.in > $@
index 34372bb6cbe9381c519c0f96f9ccdb512b75f8a8..5fe07324a1ba1feda21a023b3cba9d5f79bc75a8 100644 (file)
@@ -23,7 +23,14 @@ config.test_format = lit.formats.GoogleTest(llvm_build_mode, 'Tests')
 
 ###
 
-import os
+# If necessary, point the dynamic loader at libLLVM.so.
+if config.enable_shared:
+    libdir = os.path.join(config.llvm_obj_root, config.llvm_build_mode, 'lib')
+    shlibpath = config.environment.get(config.shlibpath_var,'')
+    if shlibpath:
+        shlibpath = ':' + shlibpath
+    shlibpath = libdir + shlibpath
+    config.environment[config.shlibpath_var] = shlibpath
 
 # Check that the object root is known.
 if config.test_exec_root is None:
index c190ffa68e5f2817fdfd1ed01926755914dedcf3..51b5bc416f69bebe8124c90203ed5fbcfd98e618 100644 (file)
@@ -5,6 +5,8 @@ config.llvm_obj_root = "@LLVM_BINARY_DIR@"
 config.llvm_tools_dir = "@LLVM_TOOLS_DIR@"
 config.llvmgcc_dir = "@LLVMGCCDIR@"
 config.llvm_build_mode = "@LLVM_BUILD_MODE@"
+config.enable_shared = @ENABLE_SHARED@
+config.shlibpath_var = "@SHLIBPATH_VAR@"
 
 # Let the main config do the real work.
 lit.load_config(config, "@LLVM_SOURCE_DIR@/test/Unit/lit.cfg")
diff --git a/tools/llvm-shlib/Makefile b/tools/llvm-shlib/Makefile
new file mode 100644 (file)
index 0000000..fd8a107
--- /dev/null
@@ -0,0 +1,67 @@
+##===- tools/shlib/Makefile --------------------------------*- Makefile -*-===##
+# 
+#                     The LLVM Compiler Infrastructure
+#
+# This file is distributed under the University of Illinois Open Source
+# License. See LICENSE.TXT for details.
+# 
+##===----------------------------------------------------------------------===##
+
+LEVEL = ../..
+LIBRARYNAME = LLVM-$(LLVMVersion)
+
+NO_BUILD_ARCHIVE = 1
+LINK_LIBS_IN_SHARED = 1
+SHARED_LIBRARY = 1
+
+include $(LEVEL)/Makefile.common
+
+# Include all archives in libLLVM.(so|dylib) except the ones that have
+# their own dynamic libraries.
+Archives := $(wildcard $(LibDir)/libLLVM*.a)
+SharedLibraries := $(wildcard $(LibDir)/libLLVM*$(SHLIBEXT))
+IncludeInLibLlvm := $(filter-out $(basename $(SharedLibraries)).a, $(Archives))
+LLVMLibsOptions := $(IncludeInLibLlvm:$(LibDir)/lib%.a=-l%)
+LLVMLibsPaths   := $(IncludeInLibLlvm)
+
+$(LibName.SO): $(LLVMLibsPaths)
+
+ifeq ($(HOST_OS),Darwin)
+    # set dylib internal version number to llvmCore submission number
+    ifdef LLVM_SUBMIT_VERSION
+        LLVMLibsOptions := $(LLVMLibsOptions) -Wl,-current_version \
+                        -Wl,$(LLVM_SUBMIT_VERSION).$(LLVM_SUBMIT_SUBVERSION) \
+                        -Wl,-compatibility_version -Wl,1
+    endif
+    # Include everything from the .a's into the shared library.
+    LLVMLibsOptions    := $(LLVMLibsOptions) -all_load
+    # extra options to override libtool defaults 
+    LLVMLibsOptions    := $(LLVMLibsOptions)  \
+                         -avoid-version \
+                         -Wl,-dead_strip \
+                         -Wl,-seg1addr -Wl,0xE0000000 
+
+    # Mac OS X 10.4 and earlier tools do not allow a second -install_name on command line
+    DARWIN_VERS := $(shell echo $(TARGET_TRIPLE) | sed 's/.*darwin\([0-9]*\).*/\1/')
+    ifneq ($(DARWIN_VERS),8)
+       LLVMLibsOptions    := $(LLVMLibsOptions)  \
+                            -Wl,-install_name \
+                            -Wl,"@executable_path/../lib/lib$(LIBRARYNAME)$(SHLIBEXT)"
+    endif
+endif
+
+ifeq ($(HOST_OS), Linux)
+    # Include everything from the .a's into the shared library.
+    LLVMLibsOptions := -Wl,--whole-archive $(LLVMLibsOptions) \
+                       -Wl,--no-whole-archive
+    # Warn if we'll need to modify the text segment when loading libLLVM.so.
+    LLVMLibsOptions += -Wl,--warn-shared-textrel
+    # Don't allow unresolved symbols.
+    LLVMLibsOptions += -Wl,--no-undefined
+    ifneq ($(ARCH), ARM)
+        # ARM's shared libgcc omits several of the __sync functions that are
+        # present in the static libgcc, so we also link in the static gcc.  This
+        # is described at http://gcc.gnu.org/PR40133.
+        LLVMLibsOptions += -lgcc
+    endif
+endif
index 6fbef54691db9070fb1f96b4b6c3821877bc9466..9dfb965d38fb0ea457a956d403b6f1e4b992fd74 100644 (file)
@@ -28,6 +28,17 @@ CPP.Flags += -I$(LLVM_SRC_ROOT)/utils/unittest/googletest/include/
 CPP.Flags += $(NO_VARIADIC_MACROS)
 TESTLIBS = -lGoogleTest -lUnitTestMain
 
+ifeq ($(ENABLE_SHARED), 1)
+  # Add the absolute path to the dynamic library.  This is ok because
+  # we'll never install unittests.
+  LD.Flags += $(RPATH) -Wl,$(LibDir)
+endif
+ifeq ($(ENABLE_SHARED), 1)
+  # Also set {DYLD,LD}_LIBRARY_PATH because OSX ignores the rpath most
+  # of the time.
+  Run.Shared := $(SHLIBPATH_VAR)="$(LibDir)$${$(SHLIBPATH_VAR):+:}$$$(SHLIBPATH_VAR)"
+endif
+
 $(LLVMUnitTestExe): $(ObjectsO) $(ProjLibsPaths) $(LLVMLibsPaths)
        $(Echo) Linking $(BuildMode) unit test $(TESTNAME) $(StripWarnMsg)
        $(Verb) $(Link) -o $@ $(TOOLLINKOPTS) $(ObjectsO) $(ProjLibsOptions) \
@@ -38,6 +49,6 @@ $(LLVMUnitTestExe): $(ObjectsO) $(ProjLibsPaths) $(LLVMLibsPaths)
 all:: $(LLVMUnitTestExe)
 
 unitcheck:: $(LLVMUnitTestExe)
-       $(LLVMUnitTestExe)
+       $(Run.Shared) $(LLVMUnitTestExe)
 
 endif