【问题标题】:What does "llvm/libexec/clang-cc" do?“llvm/libexec/clang-cc”有什么作用?
【发布时间】:2020-05-25 21:47:09
【问题描述】:

使用命令clang -### a.c可以输出clang a.c调用的命令。

对我来说,它在我的屏幕上输出以下内容(关注最后三行):

clang version 1.0 (https://llvm.org/svn/llvm-project/cfe/branches/release_26 exported)
Target: x86_64-unknown-linux-gnu
Thread model: posix
 "/usr/local/bin/llvm+clang-2.6-x86_64-linux/bin/../libexec/clang-cc" "-triple" "x86_64-unknown-linux-gnu" "-S" "-disable-free" "-main-file-name" "a.c" "--relocation-model" "static" "--disable-fp-elim" "--unwind-tables=1" "--mcpu=x86-64" "--fmath-errno=1" "-fdiagnostics-show-option" "-o" "/tmp/cc-yffqSv.s" "-x" "c" "a.c"
 "/usr/bin/gcc" "-c" "-m64" "-o" "/tmp/cc-pa2Qo4.o" "-x" "assembler" "/tmp/cc-yffqSv.s"
 "/usr/bin/gcc" "-m64" "-o" "a.out" "/tmp/cc-pa2Qo4.o"

在:/usr/local/bin/llvm+clang-2.6-x86_64-linux/bin/../libexec/clang-cc" "-triple" "x86 ...... 行中,显示命令clang 调用了这个:/libexec/clang-cc

它(文件“libexec/clang-cc”)有什么作用?

还有一个相关的问题我想问:

是否:命令clang使用项目前端“clang”,后端使用“gcc”?

因为我发现上面的最后两行代码叫做“/usr/bin/gcc”。

我已经搜索了好几个小时,你能帮我吗?

提前致谢。

【问题讨论】:

  • IIRC 从广义上讲,GCC 通过将源代码转换为抽象语法树(“前端”)、应用优化等,然后将其转换为特定于系统的程序集(“后端”)来工作。因此,根据这些定义,您将 clang 用于前端和后端。

标签: c linux compiler-construction clang llvm


【解决方案1】:

您似乎使用的是相当旧的 Clang 版本。您可能想尝试更新的。

clang-cc 是 clang C 编译器,它将 C 程序转换为汇编语言。 [注 1]。根据版本和目标,它还可以直接生成目标文件。请参阅-integrated-as 命令行标志。

如果您的 Clang 版本没有针对您的目标架构的汇编器,clang 驱动程序将尝试使用系统汇编器(和链接器)。在某些系统上,这些将是 Gcc 的一部分,尽管还有其他选项。


注意事项

  1. Clang 实际上首先将 C(或其他类似 C 的语言)编译为与平台无关的 LLVM 中间表示 (IR),然后使用 LLVM 库将其转换为优化的特定于平台的汇编代码。这两个部分就是通常所说的 Clang “前端”(C⇒LLVM)和“后端”(LLVM⇒Assembler)。这些不是单独的程序

【讨论】:

    【解决方案2】:

    它(文件“libexec/clang-cc”)有什么作用?

    它的输出"-o" "/tmp/cc-yffqSv.s" 建议它输出汇编。

    以及“gcc”的后端?

    gcc 调用的最后两行是:

    1. 从程序集中生成一个目标文件。
    2. 将对象文件链接到a.out

    【讨论】:

    • 谢谢,我现在正在尝试使用“llvm-as”和“opt”等工具找到一种等效的方法来完成“第一行”的工作。有没有可能这样做?
    猜你喜欢
    • 2018-08-19
    • 2023-03-07
    • 1970-01-01
    • 2017-03-05
    • 2020-07-23
    • 2016-01-15
    • 2014-12-12
    • 1970-01-01
    相关资源
    最近更新 更多