Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why clang selects a gcc installation?

Tags:

gcc

clang

The command "clang -v" prints:

$ clang -v
clang version 3.4 (tags/RELEASE_34/final)
Target: i386-redhat-linux-gnu
Thread model: posix
Found candidate GCC installation: /usr/bin/../lib/gcc/i686-redhat-linux/4.8.2
Found candidate GCC installation: /usr/lib/gcc/i686-redhat-linux/4.8.2
Selected GCC installation: /usr/bin/../lib/gcc/i686-redhat-linux/4.8.2

What does it mean that "clang selects a gcc installatiom"? Why? Clang is independent from gcc or not?
Thank for your help.

EDIT:
I found a probably general answer (I use Fedora 20) at the page
https://bbs.archlinux.org/viewtopic.php?id=129760

like image 708
Antonio Rizzo Avatar asked Jun 22 '14 07:06

Antonio Rizzo


People also ask

Does Clang depend on GCC?

Clang depends on libgcc and crt object files. They can be built and installed independently, of course, but there is no canonical way of doing so.

Does Clang require GCC?

Clang is a completely separate compiler (written entirely from scratch, using LLVM). You don't need GCC to use Clang, as can be shown in the case of FreeBSD (they completely replaced GCC with Clang/LLVM and don't install GCC in the base anymore for licensing reasons).

Will GCC be replaced by Clang?

Clang is designed to provide a frontend compiler that can replace GCC. Apple Inc. (including NeXT later) has been using GCC as the official compiler.

Which is better GCC or Clang?

Clang is much faster and uses far less memory than GCC. Clang aims to provide extremely clear and concise diagnostics (error and warning messages), and includes support for expressive diagnostics. GCC's warnings are sometimes acceptable, but are often confusing and it does not support expressive diagnostics.


1 Answers

Clang uses several settings from host compiler if for this host there is other default compiler (clang is default on Apple's OSX/macOS and for variants of FreeBSD). It is useful to get more compatibility with other binaries and libraries of OS.

It often uses host binutils (for linker and assembler), host compiler for crt files and internal compiler headers and c++ library for ABI compatibility in C++ programs/libraries.

Toolchain selection is part of clang driver (the clang command), implemented in https://github.com/llvm-mirror/clang/blob/master/lib/Driver/ToolChains.cpp file.

There is some documentation in Clang's "Driver Design & Internals" http://clang.llvm.org/docs/DriverInternals.html

Toolchains

The gcc driver has no direct understanding of tool chains. Each gcc binary roughly corresponds to the information which is embedded inside a single ToolChain.

The clang driver is intended to be portable and support complex compilation environments. All platform and tool chain specific code should be protected behind either abstract or well defined interfaces (such as whether the platform supports use as a driver driver).

Bind: Tool & Filename Selection. Conceptually, the driver performs a top down matching to assign Action(s) to Tools. The ToolChain is responsible for selecting the tool to perform a particular action; once selected the driver interacts with the tool to see if it can match additional actions (for example, by having an integrated preprocessor).

The driver interacts with a ToolChain to perform the Tool bindings. Each ToolChain contains information about all the tools needed for compilation for a particular architecture, platform, and operating system. A single driver invocation may query multiple ToolChains during one compilation in order to interact with tools for separate architectures.

The results of this stage are not computed directly, but the driver can print the results via the -ccc-print-bindings option. For example:

$ clang -ccc-print-bindings -arch i386 -arch ppc t0.c
# "i386-apple-darwin9" - "clang", inputs: ["t0.c"], output: "/tmp/cc-Sn4RKF.s"
# "i386-apple-darwin9" - "darwin::Assemble", inputs: ["/tmp/cc-Sn4RKF.s"], output: "/tmp/cc-gvSnbS.o"
# "i386-apple-darwin9" - "darwin::Link", inputs: ["/tmp/cc-gvSnbS.o"], output: "/tmp/cc-jgHQxi.out"
# "ppc-apple-darwin9" - "gcc::Compile", inputs: ["t0.c"], output: "/tmp/cc-Q0bTox.s"
# "ppc-apple-darwin9" - "gcc::Assemble", inputs: ["/tmp/cc-Q0bTox.s"], output: "/tmp/cc-WCdicw.o"
# "ppc-apple-darwin9" - "gcc::Link", inputs: ["/tmp/cc-WCdicw.o"], output: "/tmp/cc-HHBEBh.out"
# "i386-apple-darwin9" - "darwin::Lipo", inputs: ["/tmp/cc-jgHQxi.out", "/tmp/cc-HHBEBh.out"], output: "a.out"

This shows the tool chain, tool, inputs and outputs which have been bound for this compilation sequence. Here clang is being used to compile t0.c on the i386 architecture and darwin specific versions of the tools are being used to assemble and link the result, but generic gcc versions of the tools are being used on PowerPC.

like image 59
osgx Avatar answered Oct 20 '22 00:10

osgx