diff --git a/Makefile.config.in b/Makefile.config.in index 44d7416e4f8..e7159028146 100644 --- a/Makefile.config.in +++ b/Makefile.config.in @@ -297,3 +297,9 @@ endif # Location of the plugin header file for gold. BINUTILS_INCDIR := @BINUTILS_INCDIR@ + +# When ENABLE_LLVMC_DYNAMIC is enabled, LLVMC will link libCompilerDriver +# dynamically. This is needed to make dynamic plugins work on some targets +# (Windows). +ENABLE_LLVMC_DYNAMIC = 0 +#@ENABLE_LLVMC_DYNAMIC@ diff --git a/Makefile.rules b/Makefile.rules index 9787d5fe0b5..3ae2db8916d 100644 --- a/Makefile.rules +++ b/Makefile.rules @@ -200,17 +200,20 @@ ifdef LLVMC_PLUGIN LIBRARYNAME := $(patsubst %,plugin_llvmc_%,$(LLVMC_PLUGIN)) CPP.Flags += -DLLVMC_PLUGIN_NAME=$(LLVMC_PLUGIN) REQUIRES_EH := 1 -LD.Flags += -lCompilerDriver + +ifeq ($(ENABLE_LLVMC_DYNAMIC),1) + LD.Flags += -lCompilerDriver +endif # Build a dynamic library if the user runs `make` directly from the plugin # directory. ifndef LLVMC_BUILTIN_PLUGIN -LOADABLE_MODULE = 1 + LOADABLE_MODULE = 1 endif # TableGen stuff... ifneq ($(BUILT_SOURCES),) -LLVMC_BUILD_AUTOGENERATED_INC=1 + LLVMC_BUILD_AUTOGENERATED_INC=1 endif endif # LLVMC_PLUGIN @@ -218,8 +221,15 @@ endif # LLVMC_PLUGIN ifdef LLVMC_BASED_DRIVER TOOLNAME = $(LLVMC_BASED_DRIVER) + REQUIRES_EH := 1 -LD.Flags += -lCompilerDriver + +ifeq ($(ENABLE_LLVMC_DYNAMIC),1) + LD.Flags += -lCompilerDriver +else + LLVMLIBS = CompilerDriver.a + LINK_COMPONENTS = support system +endif # Preprocessor magic that generates references to static variables in built-in # plugins. @@ -502,8 +512,7 @@ ifeq ($(OS),Darwin) else ifeq ($(OS),Cygwin) SharedLinkOptions=-shared -nostdlib -Wl,--export-all-symbols \ - -Wl,--enable-auto-import -Wl,--enable-auto-image-base \ - -Wl,--enable-runtime-pseudo-relocs + -Wl,--enable-auto-import -Wl,--enable-auto-image-base else SharedLinkOptions=-shared endif diff --git a/autoconf/configure.ac b/autoconf/configure.ac index 0ed3a26f6c2..bb9c9d84b00 100644 --- a/autoconf/configure.ac +++ b/autoconf/configure.ac @@ -593,6 +593,24 @@ case "$enableval" in *) AC_MSG_ERROR([Invalid setting for --enable-libffi. Use "yes" or "no"]) ;; esac +dnl Only Windows needs dynamic libCompilerDriver to support plugins. +if test "$llvm_cv_os_type" = "Win32" ; then + llvmc_dynamic="yes" +else + llvmc_dynamic="no" +fi + +dnl --enable-llvmc-dynamic : should LLVMC link libCompilerDriver dynamically? +AC_ARG_ENABLE(llvmc-dynamic,AS_HELP_STRING( +--enable-llvmc-dynamic, +[Link LLVMC dynamically (default is NO, unless on Win32)]),, +enableval=$llvmc_dynamic) +if test ${enableval} = "no"; then + AC_SUBST(ENABLE_LLVMC_DYNAMIC,[[]]) +else + AC_SUBST(ENABLE_LLVMC_DYNAMIC,[[ENABLE_LLVMC_DYNAMIC=1]]) +fi + dnl===-----------------------------------------------------------------------=== dnl=== dnl=== SECTION 4: Check for programs we need and that they are the right version diff --git a/lib/CompilerDriver/Makefile b/lib/CompilerDriver/Makefile index 773eb5e8e1a..6084e885184 100644 --- a/lib/CompilerDriver/Makefile +++ b/lib/CompilerDriver/Makefile @@ -12,18 +12,26 @@ LEVEL = ../.. # We don't want this library to appear in `llvm-config --libs` output, so its # name doesn't start with "LLVM". -LIBRARYNAME = libCompilerDriver -LLVMLIBS = LLVMSupport.a LLVMSystem.a -LOADABLE_MODULE := 1 +ifeq ($(ENABLE_LLVMC_DYNAMIC),1) + LIBRARYNAME = libCompilerDriver + LLVMLIBS = LLVMSupport.a LLVMSystem.a + LOADABLE_MODULE := 1 +else + LIBRARYNAME = CompilerDriver + LINK_COMPONENTS = support system +endif + REQUIRES_EH := 1 include $(LEVEL)/Makefile.common +# Copy libCompilerDriver to the bin dir so that llvmc can find it. +ifeq ($(ENABLE_LLVMC_DYNAMIC),1) + FullLibName = $(LIBRARYNAME)$(SHLIBEXT) all-local:: $(ToolDir)/$(FullLibName) -# Copy the library to the bin dir so that llvmc can find it. $(ToolDir)/$(FullLibName): $(LibDir)/$(FullLibName) $(ToolDir)/.dir $(Echo) Copying $(BuildMode) Shared Library $(FullLibName) to $@ -$(Verb) $(CP) $< $@ @@ -32,3 +40,4 @@ clean-local:: $(Echo) Removing $(BuildMode) Shared Library $(FullLibName) \ from $(ToolDir) -$(Verb) $(RM) -f $(ToolDir)/$(FullLibName) +endif