rengolin added a comment.

In http://reviews.llvm.org/D11153#204688, @logan wrote:

> Can't we simply rely on `--rtlib=compiler-rt`?


Specifically about --rtlib=compiler-rt, there are a few choices:

1. Assume RT == unwind + c++abi. This is good for architectures where those 
libraries work reliably and are always available, either built in with Clang or 
as a package. Since it's not easy to compile libc++abi, and it requires Clang 
in the first place, I'd rather not have that until our build system is smart 
enough to do a two-stage build, like GCC.

2. Assume RT is in a GNU system. This is what we have now, and to make debug, 
profile and exception code work out-of-the-box, we need the libraries. I have 
taken the bad choice of including both libgcc libraries.

3. Assume RT is just part of the compiler library. This would force users to 
include -lgcc_s/-lunwind and/or -lgcc_eh/-lc++abi on every use of --rtlib. 
Clang includes gcc_s/eh already when rtlib=libgcc (obviously), and so does GCC. 
If we don't include some unwind/exception libraries with RT, the behaviour 
would be very different and make build systems a lot more complex.

This change is a preparation for a bigger one. The plan is:

Allow tools to have default libraries on different systems. Something like:

  void GetCompilerLibraries() {
      // pick the defaults
      switch(OS/Env) {
          default:
              llvm_unreachable("must have a default");
          case GNU: // default GNU, --rtlib=libgcc
              RT=libgcc; UNW=libgcc_s; EH=libgcc_eh;
          case GNURT: // GNU with --rtlib=compiler-rt
              RT=compiler-rt; UNW=libgcc_s; EH=libgcc_eh;
          case FreeBSD: // BSD style
              RT=compiler-rt; UNW=libunwind; EH=libc++abi;
          case Darwin: // and so on...
              RT=...
      }
      // override with arguments
      for (lib : libArgs) {
          if (lib == libunwind) UNW=lib;
          else if (lib == libc++abi) EH=lib;
          else if (lib == libgcc_s) UNW=lib;
          else if (lib == libgcc_eh) UNW=lib;
      }
  }

This way you have complete flexibility, and still produce the expected default 
results on all architectures.

GCC doesn't need that complexity because they're tied up with libgcc and 
friends.


http://reviews.llvm.org/D11153




_______________________________________________
cfe-commits mailing list
cfe-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to