在OS X上使用MacPorts GCC并通过-Wa,-q
登记Clang Integrated Assembler时,汇编程序会为每个文件生成一个警告流。警告的示例如下所示(其中很多,Stack Overflow编辑器不允许我粘贴整个流)。
我找到了LLVM Commit r250349, Stop generating coal sections。这是负责的代码,但我不清楚如何禁用警告。
+ // Issue a warning if the target is not powerpc and Section is a *coal* section.
+ Triple TT = getParser().getContext().getObjectFileInfo()->getTargetTriple();
+ Triple::ArchType ArchTy = TT.getArch();
+
+ if (ArchTy != Triple::ppc && ArchTy != Triple::ppc64) {
+ StringRef NonCoalSection = StringSwitch<StringRef>(Section)
+ .Case("__textcoal_nt", "__text")
+ .Case("__const_coal", "__const")
+ .Case("__datacoal_nt", "__data")
+ .Default(Section);
+
+ if (!Section.equals(NonCoalSection)) {
+ StringRef SectionVal(Loc.getPointer());
+ size_t B = SectionVal.find(',') + 1, E = SectionVal.find(',', B);
+ SMLoc BLoc = SMLoc::getFromPointer(SectionVal.data() + B);
+ SMLoc ELoc = SMLoc::getFromPointer(SectionVal.data() + E);
+ getParser().Warning(Loc, "section \"" + Section + "\" is deprecated",
+ SMRange(BLoc, ELoc));
+ getParser().Note(Loc, "change section name to \"" + NonCoalSection +
+ "\"", SMRange(BLoc, ELoc));
+ }
+ }
+
我无法重定向2 > /dev/null
,因为此时配置有点脆弱,它会丢弃其他警告和错误。
如何在煤炭部分上禁用Clang汇编程序警告?
当GCC编译器遇到-Wa,-q
时,它使用/opt/local/bin/clang
作为汇编程序而不是/opt/local/bin/as
。以下是相关版本。
$ /opt/local/bin/g++-mp-6 --version
g++-mp-6 (MacPorts gcc6 6.1.0_0) 6.1.0
Copyright (C) 2016 Free Software Foundation, Inc.
$ /opt/local/bin/clang --version
clang version 3.8.0 (branches/release_38 262722)
Target: x86_64-apple-darwin12.6.0
$ /opt/local/bin/as -version
Apple Inc version cctools-877.8, GNU assembler version 1.38
将-Wno-deprecated
添加到CXXFLAGS
并不会取消警告。我也试过-fno-tree-coalesce-vars
没有快乐(这可能会影响表现)。
以下sed
使用sed
或gsed
在OS X上不匹配:
$ CXXFLAGS="-DNDEBUG -g2 -O2" make CXX=/opt/local/bin/g++-mp-6 2>&1 | \
gsed -e '/(__TEXT|__DATA)/,+2d'
/opt/local/bin/g++-mp-6 -DNDEBUG -g2 -O2 -fPIC -march=native -Wa,-q -pipe -c rijndael.cpp
<stdin>:3:11: warning: section "__textcoal_nt" is deprecated
.section __TEXT,__textcoal_nt,coalesced,pure_instructions
^ ~~~~~~~~~~~~~
<stdin>:3:11: note: change section name to "__text"
.section __TEXT,__textcoal_nt,coalesced,pure_instructions
^ ~~~~~~~~~~~~~
...
/opt/local/bin/g++-mp-6 -DNDEBUG -g2 -O2 -fPIC -march=native -Wa,-q -DMACPORTS_GCC_COMPILER=1 -c cryptlib.cpp
<stdin>:3:11: warning: section "__textcoal_nt" is deprecated
.section __TEXT,__textcoal_nt,coalesced,pure_instructions
^ ~~~~~~~~~~~~~
<stdin>:3:11: note: change section name to "__text"
.section __TEXT,__textcoal_nt,coalesced,pure_instructions
^ ~~~~~~~~~~~~~
<stdin>:2665:11: warning: section "__textcoal_nt" is deprecated
.section __TEXT,__textcoal_nt,coalesced,pure_instructions
^ ~~~~~~~~~~~~~
<stdin>:2665:11: note: change section name to "__text"
.section __TEXT,__textcoal_nt,coalesced,pure_instructions
^ ~~~~~~~~~~~~~
<stdin>:3925:11: warning: section "__textcoal_nt" is deprecated
.section __TEXT,__textcoal_nt,coalesced,pure_instructions
^ ~~~~~~~~~~~~~
<stdin>:3925:11: note: change section name to "__text"
.section __TEXT,__textcoal_nt,coalesced,pure_instructions
^ ~~~~~~~~~~~~~
<stdin>:3963:11: warning: section "__textcoal_nt" is deprecated
.section __TEXT,__textcoal_nt,coalesced,pure_instructions
^ ~~~~~~~~~~~~~
<stdin>:3963:11: note: change section name to "__text"
.section __TEXT,__textcoal_nt,coalesced,pure_instructions
^ ~~~~~~~~~~~~~
[Hundred of these ommitted for each source file]
以下是相关的GCC和LLVM错误报告:
答案 0 :(得分:8)
目前,您无法禁用这些警告。您应该提交针对FSF GCC的错误报告,让他们更新他们的codegen以更加合规。
您可能还想向llvm.org提交错误报告,要求有办法让这些警告静音或限制发出的号码,以免影响用户。
答案 1 :(得分:2)
显然没有办法禁用这些警告,但我喜欢你的想法,只是将它们从构建输出中过滤掉。
我觉得sed
过于棘手,无法为复杂的(例如多线)匹配/替换模式而烦恼。这是一个简单的Python程序,用于过滤来自stderr的警告噪音,而不会完全隐藏stderr。
#!/usr/bin/python
#
# filter-noisy-assembler-warnings.py
# Author: Stuart Berg
import sys
for line in sys.stdin:
# If line is a 'noisy' warning, don't print it or the following two lines.
if ('warning: section' in line and 'is deprecated' in line
or 'note: change section name to' in line):
next(sys.stdin)
next(sys.stdin)
else:
sys.stderr.write(line)
sys.stderr.flush()
使用该程序的一种便捷方式是通过bash进程替换,仅应用于stderr:
$ make 2> >(python filter-noisy-assembler-warnings.py)
或者使用你的构建命令,我认为应该这样做:
$ CXXFLAGS="-DNDEBUG -g2 -O2" make CXX=/opt/local/bin/g++-mp-6 2> >(python filter-noisy-assembler-warnings.py)
这样,stdout
根本没有被重定向,大部分stderr
都是逐字写出来的,除了那些特别恼人的警告。
答案 2 :(得分:1)
我能够通过activating an older MacPorts build的cctools版本895_7修复这些警告。
首先,尝试简单的方法:super()
如果在该列表中没有看到sudo port activate cctools
,则可以将其检出并构建它:
cctools @895_7