trucos tips programar para optimizar optimizacion muerto ejemplos codigo c++ gcc compilation clang llvm

optimizar - tips para programar en c++



¿Cómo se puede controlar la optimización del código C/C++? (2)

No es exactamente como GCC, así que no dedique demasiado tiempo tratando de hacer coincidir los dos con precisión.

El compilador LLVM es un compilador para un lenguaje específico, LLVM. Lo que Clang hace es compilar código C ++ para LLVM, sin optimizaciones. Clang puede invocar el compilador LLVM para compilar ese código LLVM para un ensamblaje optimizado.

Me dijeron que clang es un controlador que funciona como gcc para realizar trabajos de preprocesamiento, compilación y vinculación. Durante la compilación y el enlace, hasta donde yo sé, en realidad es llvm el que hace la optimización ( "-O1", "-O2", "-O3", "-Os", "-flto" ).

Pero simplemente no puedo entender cómo está involucrado .

Parece que compilar el código fuente ni siquiera necesita una biblioteca estática como libLLVMCore.a , en cambio, los paquetes de debian clang dependen de otro paquete llamado libllvm-3.4 (versión de clang es 3.4), que contiene libLLVM-3.4.so(.1) , ¿utiliza clang esta biblioteca compartida para la optimización?

Revisé el código fuente de clang durante un tiempo y descubrí que include/clang/Driver/Options.td contiene las opciones relacionadas, pero desafortunadamente no pude encontrar los archivos fuente que incluyen ese archivo, así que todavía no estoy al tanto de la mecanismo.

Espero que alguien me dé algunas pistas.


(TL; DontWannaRead - omita hasta el final de esta respuesta)

Para responder correctamente a su pregunta, primero debe comprender la diferencia entre el front-end y el back-end de un compilador (especialmente el primero).

Clang es un front-end de compilador ( http://en.wikipedia.org/wiki/Clang ) para los lenguajes C, C ++, Objective C y Objective C ++.

El deber de Clang es el siguiente:

es decir, la traducción del código fuente C ++ (o C, o Objective C, etc.) a LLVM IR , una representación textual de bajo nivel de lo que debería hacer ese código. Para hacer esto, Clang emplea varios submódulos cuyas descripciones puedes encontrar en cualquier libro de construcción del compilador decente: lexer, analizador sintáctico + un analizador semántico (Sema), etc.

LLVM es un conjunto de bibliotecas cuya tarea principal es la siguiente: supongamos que tenemos la representación IR de LLVM de la siguiente función C ++

int double_this_number(int num) { int result = 0; result = num; result = result * 2; return result; }

el núcleo de los pases LLVM debe optimizar el código IR LLVM:

Qué hacer con el código IR LLVM optimizado depende completamente de usted: puede traducirlo a un código ejecutable x86_64 o modificarlo y luego escupirlo como código ejecutable ARM o código ejecutable de GPU. Depende del objetivo de tu proyecto.

El término "back-end" es a menudo confuso ya que hay muchos documentos que definirían las bibliotecas LLVM como un "medio" en una cadena de compiladores y definirían el "back-end" como el módulo final que genera el código (LLVM IR a código ejecutable u otra cosa que ya no necesita ser procesada por el compilador). Otras fuentes se refieren a LLVM como back-end para Clang. De cualquier forma, su rol es claro y ofrecen un mecanismo poderoso: cualquiera que sea el idioma al que se dirige (C ++, C, Objective C, Python, etc.) si tiene un front-end que lo traduce a LLVM IR, usted puede usar el mismo conjunto de bibliotecas LLVM para optimizarlo y, siempre que tenga un back-end para su arquitectura de destino, puede generar código ejecutable optimizado.

Recordando que LLVM es un conjunto de bibliotecas (no solo pases de optimización sino también estructuras de datos , módulos de utilidad, módulos de diagnóstico, etc.), Clang también aprovecha muchas bibliotecas de LLVM durante el proceso de finalización del proceso. Realmente no se puede arrancar cada módulo LLVM de Clang ya que este último se basa en el primer conjunto.

En cuanto a la razón por la cual se dice que Clang es un "controlador de compilación": Clang maneja la interpretación de los parámetros de línea de comando (las descripciones y muchas declaraciones son TableGen ''d y pueden requerir un poco más que un simple grep para navegar por las fuentes), decide qué Jobs y fases se van a ejecutar, configura el CodeGenOptions acuerdo con los niveles deseados / posibles de optimización y transformación e invoca los módulos apropiados ( clangCodeGen en BackendUtil.cpp es el que rellena un módulo pass manager con las optimizaciones para aplicar) y herramientas (por ejemplo, el enlazador ld Windows). Dirige el proceso de compilación desde el principio hasta el final.

Finalmente, sugiero leer la documentación de Clang y LLVM, son bastante explicativos y la mayoría de sus preguntas deberían buscar una respuesta allí en primer lugar.