r360946 - Add Clang shared library with C++ exports

Nico Weber via cfe-commits cfe-commits at lists.llvm.org
Thu May 16 17:52:01 PDT 2019


Hello,

this breaks building with -DLLVM_ENABLE_PIC=OFF. Maybe the new target
shouldn't be build in those builds?


Also, if I read this right, this makes static libraries for clang always be
object libraries. Is that correct? If so, this likely makes the normal
clang binary larger and less efficient than before: Normal static libraries
only get referenced .o files in them loaded, while all files in object
libraries are loaded by the linker. In theory, --gc-sections should drop
the ones that aren't needed, but due to static initializers and so on that
doesn't always work. (When we moved Chrome's build to GN, the thinking was
for a long time that we'd use object libraries instead of static libraries
everywhere. Turns out that made the binary 10% larger and slower and we had
to paddle back.)



[2523/2887] Linking CXX shared library lib/libclang_shared.so.9svn
FAILED: lib/libclang_shared.so.9svn
...
/usr/bin/ld:
tools/clang/lib/Basic/CMakeFiles/obj.clangBasic.dir/Attributes.cpp.o:
relocation R_X86_64_32 against
`.rodata._ZZNR4llvm15optional_detail15OptionalStorageIiLb1EE8getValueEvE19__PRETTY_FUNCTION__'
can not be used when making a shared object; recompile with -fPIC
tools/clang/lib/Basic/CMakeFiles/obj.clangBasic.dir/Attributes.cpp.o: error
adding symbols: Bad value
collect2: error: ld returned 1 exit status

On Thu, May 16, 2019 at 6:03 PM Chris Bieneman via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> Author: cbieneman
> Date: Thu May 16 15:06:07 2019
> New Revision: 360946
>
> URL: http://llvm.org/viewvc/llvm-project?rev=360946&view=rev
> Log:
> Add Clang shared library with C++ exports
>
> Summary:
> This patch adds a libClang_shared library on *nix systems which exports
> the entire C++ API. In order to support this on Windows we should really
> refactor llvm-shlib and share code between the two.
>
> This also uses a slightly different method for generating the shared
> library, which I should back-port to llvm-shlib. Instead of linking the
> static archives and passing linker flags to force loading the whole
> libraries, this patch creates object libraries for every library (which has
> no cost in the build system), and link the object libraries.
>
> Reviewers: tstellar, winksaville
>
> Subscribers: mgorny, cfe-commits
>
> Tags: #clang
>
> Differential Revision: https://reviews.llvm.org/D61909
>
> Added:
>     cfe/trunk/tools/clang-shlib/
>     cfe/trunk/tools/clang-shlib/CMakeLists.txt
>     cfe/trunk/tools/clang-shlib/clang-shlib.cpp
> Modified:
>     cfe/trunk/cmake/modules/AddClang.cmake
>     cfe/trunk/tools/CMakeLists.txt
>
> Modified: cfe/trunk/cmake/modules/AddClang.cmake
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/cmake/modules/AddClang.cmake?rev=360946&r1=360945&r2=360946&view=diff
>
> ==============================================================================
> --- cfe/trunk/cmake/modules/AddClang.cmake (original)
> +++ cfe/trunk/cmake/modules/AddClang.cmake Thu May 16 15:06:07 2019
> @@ -81,9 +81,12 @@ macro(add_clang_library name)
>        )
>    endif()
>    if(ARG_SHARED)
> -    set(ARG_ENABLE_SHARED SHARED)
> +    set(LIBTYPE SHARED)
> +  else()
> +    set(LIBTYPE STATIC OBJECT)
> +    set_property(GLOBAL APPEND PROPERTY CLANG_STATIC_LIBS ${name})
>    endif()
> -  llvm_add_library(${name} ${ARG_ENABLE_SHARED} ${ARG_UNPARSED_ARGUMENTS}
> ${srcs})
> +  llvm_add_library(${name} ${LIBTYPE} ${ARG_UNPARSED_ARGUMENTS} ${srcs})
>
>    if(TARGET ${name})
>      target_link_libraries(${name} INTERFACE ${LLVM_COMMON_LIBS})
>
> Modified: cfe/trunk/tools/CMakeLists.txt
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/CMakeLists.txt?rev=360946&r1=360945&r2=360946&view=diff
>
> ==============================================================================
> --- cfe/trunk/tools/CMakeLists.txt (original)
> +++ cfe/trunk/tools/CMakeLists.txt Thu May 16 15:06:07 2019
> @@ -13,6 +13,9 @@ add_clang_subdirectory(c-index-test)
>
>  add_clang_subdirectory(clang-rename)
>  add_clang_subdirectory(clang-refactor)
> +if(UNIX)
> +  add_clang_subdirectory(clang-shlib)
> +endif()
>
>  if(CLANG_ENABLE_ARCMT)
>    add_clang_subdirectory(arcmt-test)
>
> Added: cfe/trunk/tools/clang-shlib/CMakeLists.txt
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/clang-shlib/CMakeLists.txt?rev=360946&view=auto
>
> ==============================================================================
> --- cfe/trunk/tools/clang-shlib/CMakeLists.txt (added)
> +++ cfe/trunk/tools/clang-shlib/CMakeLists.txt Thu May 16 15:06:07 2019
> @@ -0,0 +1,13 @@
> +get_property(clang_libs GLOBAL PROPERTY CLANG_STATIC_LIBS)
> +
> +foreach (lib ${clang_libs})
> +  list(APPEND _OBJECTS $<TARGET_OBJECTS:obj.${lib}>)
> +  list(APPEND _DEPS $<TARGET_PROPERTY:${lib},INTERFACE_LINK_LIBRARIES>)
> +endforeach ()
> +
> +add_clang_library(clang_shared
> +                  SHARED
> +                  clang-shlib.cpp
> +                  ${_OBJECTS}
> +                  LINK_LIBS
> +                  ${_DEPS})
>
> Added: cfe/trunk/tools/clang-shlib/clang-shlib.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/clang-shlib/clang-shlib.cpp?rev=360946&view=auto
>
> ==============================================================================
> --- cfe/trunk/tools/clang-shlib/clang-shlib.cpp (added)
> +++ cfe/trunk/tools/clang-shlib/clang-shlib.cpp Thu May 16 15:06:07 2019
> @@ -0,0 +1 @@
> +// Intentionally empty source file to make CMake happy
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190516/48f3d766/attachment-0001.html>


More information about the cfe-commits mailing list