2016-07-04 49 views
7

Quando si utilizza MacPorts GCC su OS X e si aggiunge Clang Integrated Assembler tramite -Wa,-q, l'assembler genera un flusso di avvisi per ciascun file. Di seguito viene mostrato un campionamento degli avvertimenti (molti di questi, l'editor Stack Overflow non mi consente di incollare l'intero stream).Disabilita avviso assemblatore ".selezione __TEXT, __ textcoal_nt, coalesced, pure_instructions"

Ho trovato LLVM Commit r250349, Stop generating coal sections. Ecco il codice responsabile, ma non mi è chiaro come disabilitare l'avviso.

+ // 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)); 
+ } 
+ } 
+ 

non può reindirizzare 2 > /dev/null perché la configurazione è un po 'fragile, in questo momento, e scarta gli altri avvertimenti ed errori.

Come disattivare l'avviso di assemblaggio Clang nelle sezioni carbone?


Quando il compilatore GCC incontra -Wa,-q, utilizza /opt/local/bin/clang come assemblatore anziché /opt/local/bin/as. Ecco le versioni rilevanti.

$ /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 

Aggiunta -Wno-deprecated a CXXFLAGS non eliminare l'avviso. Ho anche provato -fno-tree-coalesce-vars senza gioia (che potrebbe danneggiare le prestazioni).

E il seguente sed non corrisponde su OS X utilizzando sed o gsed:

$ 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] 

Ecco il GCC rilevanti e segnalazioni di bug LLVM:

risposta

8

Allo stato attuale, non è possibile disabilitare questi avvertimenti. Probabilmente dovresti presentare una segnalazione di bug contro GCC di FSF per far sì che aggiornino i loro codegen per essere più conformi.

Si potrebbe anche voler presentare una segnalazione di bug con llvm.org per richiedere che ci sia un modo per mettere a tacere questi avvertimenti o limitare il numero che viene emesso in modo da non far dileguare l'utente.

+1

Non è la risposta che volevo sentire, ma grazie comunque. – jww

+1

Grazie ancora Jeremy. Le segnalazioni di bug sono state aggiunte alla domanda. Inoltre, se ometto '-g2 -O2', il problema scompare. Ma non è molto utile avere un programma non ottimizzato senza simboli. – jww

2

Apparentemente non c'è modo di disabilitare tali avvisi, ma mi piace l'idea di limitarsi a filtrarli dall'output della build.

Trovo che lo sed sia troppo complicato da occuparsi di schemi di corrispondenza/sostituzione complicati (ad es. Multi-linea). Ecco un semplice programma Python per filtrare tale rumore di avviso da stderr, senza nascondere completamente lo 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() 

Un modo conveniente per utilizzare tale programma è via sostituzione di processo bash, applicato solo per stderr:

$ make 2> >(python filter-noisy-assembler-warnings.py) 

o con la tua comando build, questo dovrebbe fare il trucco, penso:

$ CXXFLAGS="-DNDEBUG -g2 -O2" make CXX=/opt/local/bin/g++-mp-6 2> >(python filter-noisy-assembler-warnings.py) 

in questo modo, stdout non viene reindirizzato a tutti, e la maggior parte di stderr è scritto testualmente fuori, ad eccezione di quei particolari avvisi fastidiosi.

Problemi correlati