Ответ 1
Clang использует несколько настроек из компилятора хоста, если для этого хоста есть другой компилятор по умолчанию (clang по умолчанию используется для Apple OSX/macOS и для вариантов FreeBSD). Полезно получить большую совместимость с другими бинарниками и библиотеками ОС.
Он часто использует host binutils (для компоновщика и ассемблера), компилятор хоста для файлов crt и внутренних заголовков компиляторов и библиотеки С++ для совместимости ABI в программах и библиотеках на С++.
Выбор инструментальной цепочки является частью драйвера clang (команда clang
), реализованного в https://github.com/llvm-mirror/clang/blob/master/lib/Driver/ToolChains.cpp файле.
В Clang "Дизайн драйверов и внутренних компонентов" есть документация, http://clang.llvm.org/docs/DriverInternals.html
компилированные инструменты
Драйвер gcc не имеет прямого понимания цепей инструментов. Каждый gcc-бинарный пример примерно соответствует информации, встроенной внутри одного ToolChain.
Драйвер clang предназначен для переносимости и поддержки сложных сред компиляции. Весь код платформы и инструментальной цепочки должен быть защищен за абстрактными или четко определенными интерфейсами (например, поддерживает ли платформа поддержка драйверов).
Привязка: выбор инструмента и файла. По идее, драйвер выполняет совпадение сверху вниз, чтобы назначить Action (s) для инструментов. ToolChain отвечает за выбор инструмента для выполнения определенного действия; после выбора драйвера взаимодействует с инструментом, чтобы увидеть, может ли он соответствовать дополнительным действиям (например, с помощью встроенного препроцессора).
Драйвер взаимодействует с ToolChain для выполнения привязок инструмента. Каждый ToolChain содержит информацию обо всех инструментах, необходимых для компиляции для конкретной архитектуры, платформы и операционной системы. Один вызов драйвера может запрашивать несколько ToolChains во время одной компиляции, чтобы взаимодействовать с инструментами для отдельных архитектур.
Результаты этого этапа не вычисляются напрямую, но драйвер может распечатать результаты с помощью опции -ccc-print-bindings. Например:
$ 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"
Здесь показана цепочка инструментов, инструмент, входы и выходы, которые были связаны для этой последовательности компиляции. Здесь clang используется для компиляции t0.c в архитектуре i386, а специальные версии инструментов darwin используются для сборки и связывания результата, но общие версии gcc для этих инструментов используются в PowerPC.