r360946 - Add Clang shared library with C++ exports

Nico Weber via cfe-commits cfe-commits at lists.llvm.org
Fri May 17 05:02:24 PDT 2019


Thanks! Bots are happy with the reland. Thanks for taking the time to
explain the object library stuff!

*From: *Chris Bieneman <chris.bieneman at me.com>
*Date: *Thu, May 16, 2019 at 11:24 PM
*To: *Nico Weber
*Cc: *cfe-commits

I’ll re-land disabling if PIC is off.
>
> This doesn’t replace the static libraries with object libraries, it just
> creates an object library target (named obj.${name}) for each static
> library. That allows the objects to be referenced separately from the
> archives, so we don’t have to do the -load-all/—whole-archive stuff we do
> for libLLVM.
>
> -Chris
>
> On May 16, 2019, at 6:40 PM, Nico Weber <thakis at chromium.org> wrote:
>
> To not keep the build broken over night, and since it's a small change
> that should be easy to reland, I've reverted this for now in r360973.
>
> On Thu, May 16, 2019 at 8:52 PM Nico Weber <thakis at chromium.org> wrote:
>
>> 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/20190517/9b2b84e9/attachment-0001.html>


More information about the cfe-commits mailing list