From ea6c39d417172a8edb99667e93cd6b67cd024e6a Mon Sep 17 00:00:00 2001 From: Jeffrey Yasskin Date: Tue, 23 Feb 2010 18:10:07 +0000 Subject: Roll r96559 forward again, adding libLLVM-2.7svn.so to LLVM. This links 3 of 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 --- Makefile | 4 +-- Makefile.config.in | 8 ++++++ Makefile.rules | 18 ++++++++---- autoconf/configure.ac | 16 +++++++++++ configure | 33 +++++++++++++++++++-- examples/BrainF/Makefile | 3 ++ examples/Fibonacci/Makefile | 3 ++ examples/HowToUseJIT/Makefile | 3 ++ test/Makefile | 2 ++ test/Unit/lit.cfg | 9 +++++- test/Unit/lit.site.cfg.in | 2 ++ tools/llvm-shlib/Makefile | 67 +++++++++++++++++++++++++++++++++++++++++++ unittests/Makefile.unittest | 13 ++++++++- 13 files changed, 169 insertions(+), 12 deletions(-) create mode 100644 tools/llvm-shlib/Makefile diff --git a/Makefile b/Makefile index 20395e9470..f76f6b77bd 100644 --- 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 diff --git a/Makefile.config.in b/Makefile.config.in index 5d8645fef9..d59c81b831 100644 --- a/Makefile.config.in +++ b/Makefile.config.in @@ -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@ diff --git a/Makefile.rules b/Makefile.rules index db52985179..b5b35256b7 100644 --- a/Makefile.rules +++ b/Makefile.rules @@ -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: diff --git a/autoconf/configure.ac b/autoconf/configure.ac index 9e8cdfc226..a4ba7a4af2 100644 --- a/autoconf/configure.ac +++ b/autoconf/configure.ac @@ -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 diff --git a/configure b/configure index 54bdf0cd14..877231a99a 100755 --- 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 <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 diff --git a/examples/BrainF/Makefile b/examples/BrainF/Makefile index 2c3e066252..2e2cb6d1ae 100644 --- a/examples/BrainF/Makefile +++ b/examples/BrainF/Makefile @@ -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 diff --git a/examples/Fibonacci/Makefile b/examples/Fibonacci/Makefile index 71f6ba0ef5..d89119add7 100644 --- a/examples/Fibonacci/Makefile +++ b/examples/Fibonacci/Makefile @@ -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 diff --git a/examples/HowToUseJIT/Makefile b/examples/HowToUseJIT/Makefile index c8919db90c..c61e9e12b8 100644 --- a/examples/HowToUseJIT/Makefile +++ b/examples/HowToUseJIT/Makefile @@ -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 diff --git a/test/Makefile b/test/Makefile index 1ae54f45e3..3750fdb2f1 100644 --- a/test/Makefile +++ b/test/Makefile @@ -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 > $@ diff --git a/test/Unit/lit.cfg b/test/Unit/lit.cfg index 34372bb6cb..5fe07324a1 100644 --- a/test/Unit/lit.cfg +++ b/test/Unit/lit.cfg @@ -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: diff --git a/test/Unit/lit.site.cfg.in b/test/Unit/lit.site.cfg.in index c190ffa68e..51b5bc416f 100644 --- a/test/Unit/lit.site.cfg.in +++ b/test/Unit/lit.site.cfg.in @@ -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 index 0000000000..fd8a107c47 --- /dev/null +++ b/tools/llvm-shlib/Makefile @@ -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 diff --git a/unittests/Makefile.unittest b/unittests/Makefile.unittest index 6fbef54691..9dfb965d38 100644 --- a/unittests/Makefile.unittest +++ b/unittests/Makefile.unittest @@ -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 -- cgit v1.2.3