Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

trans: Use LLVM's writeArchive to modify archives #26926

Merged
merged 1 commit into from
Jul 10, 2015

Commits on Jul 10, 2015

  1. trans: Use LLVM's writeArchive to modify archives

    We have previously always relied upon an external tool, `ar`, to modify archives
    that the compiler produces (staticlibs, rlibs, etc). This approach, however, has
    a number of downsides:
    
    * Spawning a process is relatively expensive for small compilations
    * Encoding arguments across process boundaries often incurs unnecessary overhead
      or lossiness. For example `ar` has a tough time dealing with files that have
      the same name in archives, and the compiler copies many files around to ensure
      they can be passed to `ar` in a reasonable fashion.
    * Most `ar` programs found do **not** have the ability to target arbitrary
      platforms, so this is an extra tool which needs to be found/specified when
      cross compiling.
    
    The LLVM project has had a tool called `llvm-ar` for quite some time now, but it
    wasn't available in the standard LLVM libraries (it was just a standalone
    program). Recently, however, in LLVM 3.7, this functionality has been moved to a
    library and is now accessible by consumers of LLVM via the `writeArchive`
    function.
    
    This commit migrates our archive bindings to no longer invoke `ar` by default
    but instead make a library call to LLVM to do various operations. This solves
    all of the downsides listed above:
    
    * Archive management is now much faster, for example creating a "hello world"
      staticlib is now 6x faster (50ms => 8ms). Linking dynamic libraries also
      recently started requiring modification of rlibs, and linking a hello world
      dynamic library is now 2x faster.
    * The compiler is now one step closer to "hassle free" cross compilation because
      no external tool is needed for managing archives, LLVM does the right thing!
    
    This commit does not remove support for calling a system `ar` utility currently.
    We will continue to maintain compatibility with LLVM 3.5 and 3.6 looking forward
    (so the system LLVM can be used wherever possible), and in these cases we must
    shell out to a system utility. All nightly builds of Rust, however, will stop
    needing a system `ar`.
    alexcrichton committed Jul 10, 2015
    Configuration menu
    Copy the full SHA
    4a82427 View commit details
    Browse the repository at this point in the history