Nel fragore, come si usa per ottimizzazione della funzione di attributi?

Sto cercando di compilare una funzione specifica senza ottimizzazione utilizzando clang, al fine di evitare talune relative alla sicurezza, chiamate a memset() di essere ottimizzato di distanza.

Secondo la documentazione che può essere trovato qui, esiste un optnone attributo che permette questo. Inoltre, un esempio può essere trovato qui.

Purtroppo (almeno sulla versione precedente di clang, su OS X 10.9.5), questa è la causa avvisi del compilatore, come si può vedere in questo esempio:

$ clang --version
Apple LLVM version 6.0 (clang-600.0.51) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin13.4.0
Thread model: posix

$ cat optnone.c
#include <string.h>

__attribute__((optnone)) void*
always_memset(void *b, int c, size_t len)
{
    return memset(b, c, len);
}

$ clang -Wall -O3 -c -o optnone.o optnone.c
optnone.c:3:16: warning: unknown attribute 'optnone' ignored [-Wattributes]
__attribute__((optnone)) void*
               ^
1 warning generated.

Ho provato anche utilizzando #pragma clang optimize off, ma questo ha causato un unknown pragma ignored avviso.

Qualcuno sa perché questo non funziona? Mi sono perso un prerequisito per l’utilizzo di questa funzione? (Ho provato anche utilizzando i vari -std= parametri, tra cui c11, gnu11, c99, e gnu99, ma non è cambiato nulla il comportamento).

qui
sapete quale versione di clang che è? Ho notato questo viene chiamato via clang++. Ho provato anche quella, ma nessun cambiamento nel mio risultati.
Sembra che questo non funziona con Apple clang o llvm-gcc – segnalare un bug.
clang versione 3.5.0 (tag/RELEASE_350/finale 217394)
Io non sono d’accordo; questa è una domanda sull’utilizzo di una particolare funzionalità del compilatore per risolvere quello che è probabilmente un bug del compilatore. È giusto che se un memset()-come costruire è sufficiente dovrebbe essere una questione a parte, ma in questo caso non soddisfa il requisito. Ogni altra piattaforma si comporta correttamente quando un compilatore specifico attributo viene utilizzato per disattivare l’ottimizzazione off. (anche se la convalida che soddisfa il requisito non è facile!)

OriginaleL’autore mpontillo | 2014-10-08

2 Replies
  1. 6

    Come clang documentazione dice,

    Clang supporta GCC gnu attributo namespace. Tutti GCC attributi che sono ammessi con la __attribute__((foo)) sintassi sono accettati anche come [[gnu::foo]]. Questo solo si estende agli attributi specificati dal GCC (vedere l’elenco di GCC funzione di attributi, GCC variabile attributi, e GCC tipo di attributi). Come con il GCC di attuazione, questi attributi devono appartenere al dichiaratore-id in una dichiarazione, il che significa che deve andare all’inizio della dichiarazione o subito dopo il nome dichiarata.

    Provare

    void* always_memset(void *b, int c, size_t len) [[gnu::optimize(0)]]

    o

    void* always_memset(void *b, int c, size_t len) __attribute__ ((optimize("0")));
    Si dovrebbe provare __attribute__ ((optnone)) invece, optimize("0") non è definito sulla mia macchina

    OriginaleL’autore EvgeniyZh

  2. 3

    Come suggerito da @dulacc nel suo commento, __attribute__ ((optnone)) opere clang 9.0.0 su Mac High Sierra.

    OriginaleL’autore Paul Price

Lascia un commento