¿Cuáles son las implicaciones enEl uso de código de bytes LLVM para las bibliotecas (en lugar de archivos de objetos nativos)
- portabilidad (convención de llamada: ¿realmente importa en un nivel LLVM cuando solamente poner en funciones de la biblioteca OS C o)
- tiempo de enlace
- optimizaciones
me gustaría compilar un lenguaje de juguete con LLVM, debido a todas las partes duras ya que están presentes (optimización, generación de código objeto), pero estoy luchando con un concepto que me gustaría conservar si vale la pena: los archivos de la biblioteca deberían ser redistribuibles, utilizables como lib estáticos y compartidos (para vincular, en el caso compartido, un archivo real o dll se generará cuando la aplicación final esté vinculada).), portátil. Creo que esto reduciría parte del tiempo de compilación (ya que la generación del código nativo y quizás la optimización solo se realiza una vez, en el tiempo del enlace binario final). Imagino que el vinculador se ocupará de llamar a la convención (si es posible) y la conversión a una biblioteca compartida si así lo solicita. En una adición muy extendida, quizás LLVM podría aprovecharse como , no como el enlace, y usar LLVM JIT para ejecutar el bytecode generado directamente, eliminando por completo los tiempos de enlace al escribir el código.
suena esto
- Factible?
- ¿Lo vale usted? Sé que el tiempo de enlace de C/C++ es comparativamente largo, lo que es problemático cuando se reconstruye con frecuencia. ¿Qué ocurre con la optimización de tiempo de enlace libre (cfr
/GL
y-flto
, ya que esencialmente se vincularán bytecode LLVM, que luego se convertirá en un binario nativo).
Esto puede ser una pregunta vaga, si tengo que aclarar algo, por favor pregunte.
¿Tiempo de enlace más largo que qué? El tiempo de enlace de Afaik depende principalmente del número de símbolos por unidad de compilación que debe resolverse (se origina en otras unidades de compilación) y no en el lenguaje.Tampoco estoy seguro de que el bytecode de LLVM elimine automáticamente las convenciones de llamadas. Entonces el código de C++ compilado con LLVM no podía acceder a nada compilado no LLVM. –
@MarcovandeVoort: LLVM se ocupa de llamar a la convención cuando genera código de objeto nativo. Si solo llamo al código LLVM (entonces no hay librerías de sistema operativo), todo seguirá la misma convención de llamadas generada por LLVM. El código C/C++ se compila con una cierta convención de llamadas en mente en primer lugar. El código de bits LLVM generado por Clang no es independiente de la plataforma. No veo por qué mi lenguaje de juguete debe preocuparse por las convenciones de llamadas de C internamente. – rubenvb