禁用汇编程序警告“.section __TEXT,__textcoal_nt,coalesced,pure_instructions”

Disable assembler warning ".section __TEXT,__textcoal_nt,coalesced,pure_instructions"

在 OS X 上使用 MacPorts GCC 并通过 -Wa,-q 启用 Clang 集成汇编器时,汇编器会为每个文件生成一系列警告。下面显示了警告的示例(其中很多,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 在 OS X 上使用 sedgsed 不匹配:

$ 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 错误报告:

目前,您无法禁用这些警告。您可能应该提交一份针对 FSF GCC 的错误报告,让他们更新他们的代码生成器以使其更加合规。

您可能还想通过 llvm.org 提交错误报告,以请求有一种方法可以使这些警告静音或限制发出的数量以免用户泛滥。

显然没有办法禁用这些警告,但我喜欢您将它们从构建输出中过滤掉的想法。

我发现 sed 对于复杂的(例如多行)match/replace 模式来说太棘手了。这是一个简单的 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 都是逐字写出的,除了那些特别烦人的警告。

我能够通过 activating an older MacPorts build 版本 895_7 的 cctools 修复这些警告。

首先,尝试简单的方法:sudo port activate cctools

如果您没有在该列表中看到 cctools @895_7,您可以检查并构建它:

git clone --single-branch https://github.com/macports/macports-ports.git /tmp/mp
cd /tmp/mp/devel/cctools
git checkout cc1b891e8d22e2ca7563c5e3031de41d4268ec8a
sudo port install +universal