2012-05-16 14 views
28

He creado mi propio lenguaje de código de bytes (muy simple) y una máquina virtual para ejecutarlo. Funciona bien, pero ahora me gustaría usar gcc (o cualquier otro compilador disponible libremente) para generar código de bytes para esta máquina desde un programa c normal. Entonces, la pregunta es, ¿cómo modifico o extiendo gcc para que pueda generar mi propio código de bytes? Tenga en cuenta que NO quiero compilar mi código de bytes en código de máquina, quiero "compilar" c-code con (mi propio) código de bytes.¿Cómo escribir tu propio generador de código backend para gcc?

Me doy cuenta de que esta es una pregunta potencialmente grande, y es posible que la mejor respuesta sea "ve a ver el código fuente de gcc". Solo necesito ayuda con cómo comenzar con esto. Me imagino que debe haber algunos artículos o libros sobre este tema que podrían describir el proceso para agregar un generador personalizado a gcc, pero no he encontrado nada al buscar en Google.

+19

Ve a LLVM. GCC es conocido por ser difícil de extender. – Mat

+1

esta guía podría ayudarlo: http://www.drdobbs.com/retargeting-the-gnu-c-compiler/184401529 "Una mirada interna sobre cómo implementar el compilador GNU C a su plataforma de elección." - una bonita buena lectura, aunque todavía no intenté seguirlo. –

Respuesta

9

Es un trabajo duro.

Por ejemplo, también diseñé mi propia "arquitectura" con mi propio código de bytes y quería generar código C/C++ con GCC para ello. Esta es la forma en que lo hago:

  1. Al principio, debe leer todo sobre la portación en el manual de GCC.
  2. También no olvide leer también GCC Internals.
  3. Lea muchas cosas sobre los compiladores.
  4. También mire este question y las respuestas aquí.
  5. Google para obtener más información.
  6. Pregúntate si estás realmente listo.
  7. Asegúrese de tener una máquina de café muy buena ... la necesitará.
  8. Comience a agregar archivos de máquina dependiente a gcc.
  9. Compila gcc en una forma transversal de host-destino.
  10. Compruebe los resultados del código en el Hex-Editor.
  11. Haga más pruebas.
  12. Ahora divertirse con su propia arquitectura: D

Cuando haya terminado puede utilizar C o C++ sólo sin bibliotecas os-dependet (que tiene actualmente ningún sistema operativo que se ejecuta en su arquitectura) y que ahora debe (si lo necesita) compile muchas otras bibliotecas con su compilador cruzado para tener un buen marco.

PS: LLVM (Clang) es más fácil de virar ... ¿quizás quieres comenzar allí?

+0

Algunos consejos muy prácticos aquí :) ¡Gracias! Gcc parece ser una bestia temible. Sin duda echaré un vistazo a LLVM también. Este proyecto parece más grande de lo que originalmente pensé, pero lo intentaré ... –

+1

Hazlo :) No hay una forma incorrecta de hacer algo como esto ... – pearcoding

+0

@pearcoding ¿En qué terreno afirmas que LLVM es más fácil? a puerto que gcc? ¿Intentó portar ambos y llegó a esta conclusión, o usó la conclusión de otra persona? Si este último, haga referencia por favor. Gracias. – Bregalad

2

No es tan duro como todo eso. Si su máquina objetivo es razonablemente similar a otra, tome sus definiciones RTL (?) Como punto de partida y modifíquelas, luego make compile test a través de las etapas de arranque; enjuague y repita hasta que funcione. Probablemente no tenga que escribir ningún código real, solo plantillas de definición de máquina.

15

Estoy ocupado portando gcc a un procesador de 8 bits que diseñamos anteriormente. Para nuestra máquina es una tarea algo difícil porque es de 8 bits y solo tenemos un acumulador, pero si tiene más recursos puede ser fácil. Así es como estamos tratando de administrarlo con gcc 4.9 y utilizando cygwin:

  1. Descargar gcc 4.9 fuente
  2. Añadir el nombre de la arquitectura a config.sub alrededor de la línea 250 mirada de # Decode aliases for certain CPU-COMPANY combinations. En esa lista añadir | my_processor \
  3. En la misma mirada archivo para # Recognize the basic CPU types with company name. agregarse a la lista : | my_processor-* \
  4. buscar el archivo gcc/config.gcc, en la mirada de archivos para el caso $ {target} es alrededor de la línea 880, añádase la siguiente manera:

    ;; 
    my_processor*-*-*) 
        c_target_objs="my_processor-c.o" 
        cxx_target_objs="my_processor-c.o" 
        target_has_targetm_common=no 
        tmake_file="${tmake_file} my_processor/t-my_processor" 
        ;; 
    
  5. Crear una carpeta gcc-4.9.0\gcc\config\my_processor
  6. Copiar archivos de un proyecto existente y simplemente editarlo, o crear sus propios desde cero. En nuestro proyecto que habíamos copiado todos los archivos del proyecto msp430 y editado todo
  7. Usted debe tener los siguientes archivos (no todos los archivos son obligatorios):
    • my_processor.c
    • my_processor.h
    • my_processor.md
    • my_processor.opt
    • my_processor-c.c
    • my_processor.def
    • my_processor-protos.h
    • constraints.md
    • predicates.md
    • README.txt
    • t-my_processor
  8. crear un camino gcc-4.9.0/build/object
  9. plazo ../../configure --target=my_processor --prefix=path for my compiler --enable-languages="c"
  10. hacen
  11. make install
  12. Investigue y depure mucho.
  13. Diviértete.
+2

Esta respuesta merece más votos positivos. Solo por curiosidad, ¿en qué arquitectura trataste de portar gcc? ¿Qué tan bien tuviste éxito? ¿También portó binutils, o usó un ensamblador externo en su lugar?¿Cómo podría probar el comportamiento correcto completo del código emitido? Gracias. – Bregalad

+0

@Bregalad cruzamos compilados desde Linux a nuestra propia arquitectura, un conjunto de instrucciones muy simple que diseñamos. Entonces el compilador vivía en un servidor Linux. Abundaron en el proyecto, pero aprendimos mucho. Si lo hago, pasaré más tiempo aprendiendo gcc internamente. No portamos binutils en absoluto, sino que construimos nuestro propio ensamblador. Nuestra archircture fue lo suficientemente simple como para tomar esta ruta. Estoy seguro de que hay mejores métodos para probar el código emitido, pero solo evaluamos el código ensamblado generado manualmente. – Tanyong