llvm: ¿es posible fusionar validación y compilación en una sola etapa?

Generally speaking, when writing a llvm frontend, one will take an AST and first check that its semantics is well-defined. After this, one will take the AST and perform the IR build phase. I was wondering, how realistic is to perform directly the IR build phase onto the AST, and if errors are found during the build process, revert any partial changes to the module object?

I assume something like this would be required:

  • remove defined Types
  • remove defined Globals
  • anything else i'm missing?

Any ideas about this? what are the general guidelines of what needs to done for a clean revert of module changes after a failed build phase?

Now, this is thinking in terms of optimistically compiling, and failing gracefully it somethings goes wrong. It might very well be that this is completely impossible or discouraged under the current LLVM model. A clear and well-documented answer in this regard is also completely acceptable

Editar In the end, I just want a reasonable way to add functions incrementally but revert gracefully to previous state of module and/or LLVMContext if a function build fails. Whatever is the preferred approach for that will be entirely satisfactory.


preguntado el 01 de febrero de 12 a las 22:02

1 Respuestas

Many compilers (not necessarily LLVM-related) mix semantic analysis with code generation, so it can definitely be done. However, I'm puzzled by your reference to "revert any partial changes to the module object". When you start building an IR module and encounter a semantic error in the AST, what is your plan? Do you want to spit an incomplete module? Why? Thinking about the way any regular compiler works, if there are semantic errors in the code (i.e. reference to an undefined variable), no output is created. Would you like something different?

Respondido 03 Feb 12, 18:02

Thanks for replying - well, the idea is that the code (i.e: the module) should be kept live (for JIT purposes) even if an attempt to build/add a new function fails. From what you say i infer that maybe i need to transfer existing/validated functions to a separate module and build new functions always in a new module? - merodeador

@lurscher: if you're adding build functions to a module incrementally, can't you just wait until the function is built completely before adding it? If the build failed, you don't add anything to the module. If it succeeded, you add a complete function. - Eli Bendersky

that is exactly my question: can i add a function (and the associated types) después de the function/types are successfully built? my understanding is that as you start doing things like CreateFunction or CreateType you are already modifying the module - merodeador

@lurscher: I'm pretty sure you can just add a function to a module. Take a look at the LLVM linker - it merges modules so it must move functions around - Eli Bendersky

llvm::Function::Create takes as last parameter the function module. Are you saying that i can call this function después de all the blocks, instructions, etc. are correctly generated? assuming it is so, if something goes wrong, i can simply not call it? can i still free/recover/reuse the generated blocks/instructions or they will keep dangling on the LLVMContext? OR, maybe the approach i suggested on my first comment to you would be preferred? (That is assuming that separate modules in separate LLMVContexts can still exchange content) - Thanks for any suggestions you might have on this! - merodeador

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.