From: Reid Spencer Date: Mon, 7 Aug 2006 23:12:15 +0000 (+0000) Subject: For PR780: X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=commitdiff_plain;h=42fe455d3789b8e7913f463f85cd5606d7fb6efe For PR780: 1. Change the usage of LOADABLE_MODULE so that it implies all the things necessary to make a loadable module. This reduces the user's burdern to get a loadable module correctly built. 2. Document the usage of LOADABLE_MODULE in the MakefileGuide 3. Adjust the makefile for lib/Transforms/Hello to use the new specification for building loadable modules 4. Adjust the sample project to not attempt to build a shared library for its little library. This was just wasteful and not instructive at all. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@29551 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Makefile.rules b/Makefile.rules index 3fe8090c9bd..c9795ec6969 100644 --- a/Makefile.rules +++ b/Makefile.rules @@ -323,12 +323,17 @@ LLVMGXXWITHPATH := PATH="$(LLVMToolDir):$(PATH)" $(LLVMGXX) # Adjust LD.Flags and Libtool.Flags depending on the kind of library that is # to be built. Note that if LOADABLE_MODULE is specified then the resulting -# shared library can be opened with dlopen +# shared library can be opened with dlopen. Also, LOADABLE_MODULE implies +# several other things so we force them to be defined/on. +ifdef LOADABLE_MODULE + SHARED_LIBRARY := 1 + DONT_BUILD_RELINKED := 1 + LINK_LIBS_IN_SHARED := 1 + LD.Flags += -module +endif + ifdef SHARED_LIBRARY LD.Flags += -rpath $(LibDir) - ifdef LOADABLE_MODULE - LD.Flags += -module - endif else LibTool.Flags += --tag=disable-shared endif @@ -425,10 +430,12 @@ LTCompile.CXX = $(LIBTOOL) $(LibTool.Flags) --mode=compile $(Compile.CXX) BCCompile.CXX = $(LLVMGXXWITHPATH) $(CPP.Flags) $(CompileCommonOpts) \ $(CXX.Flags) Preprocess.CXX= $(CXX) $(CPP.Flags) $(CompileCommonOpts) $(CXX.Flags) -E -Link = $(LIBTOOL) $(LibTool.Flags) --mode=link $(CXX) $(CPP.Flags) \ - $(CXX.Flags) $(CompileCommonOpts) $(LD.Flags) $(Strip) -Relink = $(LIBTOOL) $(LibTool.Flags) --mode=link $(CXX) $(CPP.Flags) \ - $(CXX.Flags) $(CompileCommonOpts) $(Relink.Flags) +Link = $(CXX) $(CPP.Flags) $(CXX.Flags) $(CompileCommonOpts) \ + $(LD.Flags) $(Strip) +LTLink = $(LIBTOOL) $(LibTool.Flags) --mode=link $(Link) +Relink = $(CXX) $(CPP.Flags) $(CXX.Flags) $(CompileCommonOpts) \ + $(Relink.Flags) +LTRelink = $(LIBTOOL) $(LibTool.Flags) --mode=link $(Relink) LTInstall = $(LIBTOOL) $(LibTool.Flags) --mode=install $(INSTALL) \ $(Install.Flags) ProgInstall = $(INSTALL) $(Install.StripFlag) -m 0755 @@ -772,15 +779,21 @@ ifdef SHARED_LIBRARY all-local:: $(LibName.LA) ifdef LINK_LIBS_IN_SHARED +ifdef LOADABLE_MODULE +SharedLibKindMessage := "Lodable Module" +else +SharedLibKindMessage := "Shared Library" +endif $(LibName.LA): $(ObjectsLO) $(LibDir)/.dir - $(Echo) Linking $(BuildMode) Shared Library $(LIBRARYNAME)$(SHLIBEXT) - $(Verb) $(Link) -o $@ $(ObjectsLO) \ - $(ProjLibsOptions) $(LLVMLibsOptions) + $(Echo) Linking $(BuildMode) $(SharedLibKindMessage) \ + $(LIBRARYNAME)$(SHLIBEXT) + $(Verb) $(LTLink) -o $@ $(ObjectsLO) $(ProjLibsOptions) \ + $(LLVMLibsOptions) $(Verb) $(LTInstall) $@ $(LibDir) else $(LibName.LA): $(ObjectsLO) $(LibDir)/.dir $(Echo) Linking $(BuildMode) Shared Library $(LIBRARYNAME)$(SHLIBEXT) - $(Verb) $(Link) -o $@ $(ObjectsLO) + $(Verb) $(LTLink) -o $@ $(ObjectsLO) $(Verb) $(LTInstall) $@ $(LibDir) endif @@ -884,7 +897,7 @@ all-local:: $(LibName.O) $(LibName.O): $(ObjectsO) $(LibDir)/.dir $(Echo) Linking $(BuildMode) Object Library $(notdir $@) - $(Verb) $(Relink) -o $@ $(ObjectsO) + $(Verb) $(LTRelink) -o $@ $(ObjectsO) clean-local:: ifneq ($(strip $(LibName.O)),) @@ -983,7 +996,7 @@ endif $(ToolBuildPath): $(ObjectsO) $(ProjLibsPaths) $(LLVMLibsPaths) $(Echo) Linking $(BuildMode) executable $(TOOLNAME) $(StripWarnMsg) - $(Verb) $(Link) -o $@ $(TOOLLINKOPTS) $(ObjectsO) $(ProjLibsOptions) \ + $(Verb) $(LTLink) -o $@ $(TOOLLINKOPTS) $(ObjectsO) $(ProjLibsOptions) \ $(LLVMLibsOptions) $(ExtraLibs) $(TOOLLINKOPTSB) $(LIBS) $(Echo) ======= Finished Linking $(BuildMode) Executable $(TOOLNAME) \ $(StripWarnMsg) diff --git a/docs/MakefileGuide.html b/docs/MakefileGuide.html index ca19f5f23d3..a1aa934fb82 100644 --- a/docs/MakefileGuide.html +++ b/docs/MakefileGuide.html @@ -30,7 +30,8 @@
  1. Libraries
      -
    1. Bytecode Modules
    2. +
    3. Bytecode Modules
    4. +
    5. Loadable Modules
  2. Tools @@ -259,7 +260,7 @@ - +

    In some situations, it is desireable to build a single bytecode module from a variety of sources, instead of an archive, shared library, or bytecode @@ -279,6 +280,40 @@

    + + +
    +

    In some situations, you need to create a loadable module. Loadable modules + can be loaded into programs like opt or llc to specify + additional passes to run or targets to support. Loadable modules are also + useful for debugging a pass or providing a pass with another package if that + pass can't be included in LLVM.

    +

    LLVM provides complete support for building such a module. All you need to + do is use the LOADABLE_MODULE variable in your Makefile. For example, to + build a loadable module named MyMod that uses the LLVM libraries + LLVMSupport.a and LLVMSystem.a, you would specify:

    +
    
    +     LIBRARYNAME := MyMod
    +     LOADABLE_MODULE := 1
    +     USEDLIBS := LLVMSupport.a LLVMSystem.a
    +  
    +

    Use of the LOADABLE_MODULE facility implies several things:

    +
      +
    1. There will be no "lib" prefix on the module. This differentiates it from + a standard shared library of the same name.
    2. +
    3. The SHARED_LIBRARY variable is turned + on.
    4. +
    5. The LINK_LIBS_IN_SHARED variable + is turned on.
    6. +
    7. The DONT_BUILD_RELINKED variable + is turned on.
    8. +
    +

    A loadable module is loaded by LLVM via the facilities of libtool's libltdl + library which is part of lib/System implementation.

    +
    +
    diff --git a/lib/Transforms/Hello/Makefile b/lib/Transforms/Hello/Makefile index ccd9caff16a..606fcfedf53 100644 --- a/lib/Transforms/Hello/Makefile +++ b/lib/Transforms/Hello/Makefile @@ -9,8 +9,8 @@ LEVEL = ../../.. LIBRARYNAME = LLVMHello -SHARED_LIBRARY = 1 LOADABLE_MODULE = 1 +USEDLIBS = LLVMSupport.a LLVMSystem.a include $(LEVEL)/Makefile.common diff --git a/projects/sample/lib/sample/Makefile b/projects/sample/lib/sample/Makefile index 6b1ea05361b..c85ae1a711c 100644 --- a/projects/sample/lib/sample/Makefile +++ b/projects/sample/lib/sample/Makefile @@ -9,10 +9,8 @@ LEVEL=../.. # Give the name of a library. This will build a dynamic version. # LIBRARYNAME=sample -SHARED_LIBRARY=1 -LOADABLE_MODULE=1 -#DONT_BUILD_RELINKED=1 -#ARCHIVE_LIBRARY=1 +DONT_BUILD_RELINKED=1 +BUILD_ARCHIVE=1 # # Include Makefile.common so we know what to do. diff --git a/projects/sample/tools/sample/Makefile b/projects/sample/tools/sample/Makefile index 1127f755755..39da928329e 100644 --- a/projects/sample/tools/sample/Makefile +++ b/projects/sample/tools/sample/Makefile @@ -14,7 +14,7 @@ TOOLNAME=sample # List libraries that we'll need # We use LIBS because sample is a dynamic library. # -USEDLIBS = sample +USEDLIBS = sample.a # # Include Makefile.common so we know what to do.