【发布时间】:2012-02-17 23:38:04
【问题描述】:
我是clang 的新手。我已经阅读了一篇关于使用clang 编译器前端从cuda 到opencl 的源到源转换的论文。
谁能告诉我为什么有时会使用-cc1这个选项?
【问题讨论】:
标签: compiler-construction llvm clang
我是clang 的新手。我已经阅读了一篇关于使用clang 编译器前端从cuda 到opencl 的源到源转换的论文。
谁能告诉我为什么有时会使用-cc1这个选项?
【问题讨论】:
标签: compiler-construction llvm clang
Clang 编译器前端有几个额外的 Clang 特定功能,这些功能没有通过 GCC 兼容性驱动程序接口公开。 -cc1 参数表示要使用编译器前端,而不是驱动程序。 clang -cc1 功能实现了核心编译器功能。
所以,简单地说。如果您不提供-cc1,那么您可以期待标准 GCC 的“外观和感觉”。这是绝大多数编译器标志的工作方式,就像您期望它们与 GCC 一起工作一样。如果您传递选项“-cc1”,那么您将设置 Clang 编译器标志。因此,GCC 可能存在差异。
希望这能让它更清楚一点。
【讨论】:
clang -cc1 没有立即返回?我希望为带有许多参数的clang -cc1 命令设置别名。当不带参数运行它时,我希望它返回类似clang-7: error: no input files。
[ -t 0 ] 测试标准输入(0)是否在终端中打开,如alias cc1='if [ -t 0 ]; then clang -cc1; else echo No; fi'。您还可以从包装函数中查看您自己的参数,例如alias cc1='(){ [ $# > 0 ] &&... }';试试这个,如果它无法读取任何参数并且标准输入在终端上,它会中止 clang 调用。 alias cc1='(){ go=false; for a do { [ -r "$a" ] || continue; go=true }; done; if ! $go && [ -t 0 ]; then echo "Sorry" 1>&2; else clang -cc1 $@; fi }'。我不认为[ -r "$a" ] 是防弹的,但它总比$# 好,总比没有好。
通常的编译器由所谓的编译器驱动程序组成,它知道如何执行编译器本身、汇编器、链接器等,以及编译器本身,它只获取源代码(有时已经预处理)并发出汇编器/目标代码。
Clang 在单个二进制文件中实现所有这些组件,不同之处仅在于 cmdline。这里clang -cc1 使用其内部/未记录的选项集等调用编译器本身。
【讨论】: