En clang, ¿cómo se usan los atributos de optimización por función?

3 minutos de lectura

Estoy tratando de compilar una función específica sin optimización usando clangpara evitar ciertas llamadas relacionadas con la seguridad a memset() de ser optimizado lejos.

De acuerdo a la documentación que se puede encontrar aquíexiste un optnone atributo que permite esto. También, Un ejemplo puede ser encontrado aquí.

Desafortunadamente, (al menos en la siguiente versión de clangen OS X 10.9.5), esto genera advertencias del compilador, como se puede ver en este ejemplo:

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

También probé usando #pragma clang optimize offpero esto provocó un unknown pragma ignored advertencia.

¿Alguien sabe por qué esto no funciona? ¿Me perdí un requisito previo para usar esta función? (También intenté usar varios diferentes -std= parámetros, incluyendo c11, gnu11, c99y gnu99pero nada cambió el comportamiento.)

  • trabaja aquí

    –Bryan Chen

    08/10/2014 a las 21:37

  • @BryanChen, ¿sabes qué versión de clang es esa? Me di cuenta de que está siendo llamado a través de clang++. Lo intenté también, pero no hubo cambios en mis resultados.

    – mpontillo

    08/10/2014 a las 21:40

  • Parece que esto no funciona con el sonido metálico de Apple o llvm-gcc – presentar un informe de error.

    – Pablo R.

    08/10/2014 a las 21:42


  • clang versión 3.5.0 (etiquetas/RELEASE_350/final 217394)

    –Bryan Chen

    8 oct 2014 a las 21:43

  • @R.., no estoy de acuerdo; esta es una pregunta sobre cómo usar una característica particular del compilador para evitar lo que es posiblemente un error del compilador. Tienes razón en que sea o no un memset()-como construcción es suficiente debería ser una pregunta separada, pero en este caso cumple con el requisito. Todas las demás plataformas se comportan correctamente cuando se usa un atributo específico del compilador para desactivar la optimización. (¡aunque validar que cumple con el requisito no es fácil!)

    – mpontillo

    9 oct 2014 a las 5:05

Como dice la documentación clang,

Clang es compatible con el espacio de nombres de atributos gnu de GCC. Todos los atributos GCC que se aceptan con el __attribute__((foo)) sintaxis también se aceptan como [[gnu::foo]]. Esto solo se extiende a los atributos especificados por GCC (consulte la lista de atributos de funciones de GCC, atributos de variables de GCC y atributos de tipo de GCC). Al igual que con la implementación de GCC, estos atributos deben pertenecer al id del declarador en una declaración, lo que significa que deben ir al comienzo de la declaración o inmediatamente después del nombre que se declara.

Tratar

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")));

  • Deberías intentarlo __attribute__ ((optnone)) en lugar de, optimize("0") no está definido en mi máquina

    – dulaccc

    3 de octubre de 2015 a las 9:28

Como defiende @dulacc en su comentario, __attribute__ ((optnone)) funciona en clang 9.0.0 en High Sierra de Mac.

  • __attribute__((optnone)) funciona en Windows, pero el resultado es bastante ineficiente porque desactiva todas las optimizaciones. Realmente extraño el control más detallado de las optimizaciones que tiene gcc, como __attribute__((optimize(“-fno-unsafe-math-optimizations”)))

    – Una niebla

    28 de septiembre de 2019 a las 7:34


¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad