Skip to content

Rust should have an optional dependency on C++ #10469

Closed
@alexcrichton

Description

@alexcrichton

Right now, any compilation of any rust library will have a dependency on libstdc++. If one views Rust as a targeted replacement for C++, then it seems weird to depend on it!

There are currently four reasons why rust depends on C++

  1. We use the new operator which I believe throws on OOM
  2. We use statically initialized mutexes (statically run constructors)
  3. We use exceptions to implement unwinding.
  4. When linking librustrt, g++ is used instead of gcc

I have successfully extracted the dependency on C++ as part of alexcrichton@4b2bb6f. That patch is nowhere near a landable form, however.

I'm coming to believe that this is a fairly important dependency that we should be able to rid ourselves of (with strings attached). I propose the following plan of attack.

  1. Complete Create bindings for native mutexes #9105
  2. Remove all usage of static mutexes from C++ along with usage of the new operator
  3. Move as many foo.cpp files to foo.c to prevent C++ from leaking in again.
  4. Add a compilation profile to librustrt. This new profile would turn rust_try to just calling f, and rust_begin_unwind would be equivalent to assert(false). This new librustrt would be distributed along the rust standard libraries as librustrt_no_landing_pads or something like that.
  5. When compiling with -Z no-landing-pads, link to librustrt_no_landing_pads instead of librustrt

As the strategy implies, the only way to drop the C++ dependency would be to forgo unwinding entirely. For now this is our best option of dropping the C++ dependency, and perhaps in the future if we ever implement unwinding without C++ exceptions we won't even need this business of a separate compilation profile.

How do others feel about this?

Metadata

Metadata

Assignees

No one assigned

    Labels

    P-lowLow priority

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions