#ifndef LLVMLAYER_H
#define LLVMLAYER_H

#include "llvm/IR/Module.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/PassManager.h"
#include "llvm/IR/CallingConv.h"
#include "llvm/IR/Verifier.h"
#include "llvm/IR/IRPrintingPasses.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/IR/LLVMContext.h"
#include "utils.h"
//#include "ast.h"
namespace xreate {
    class AST;

    class LLVMLayer {
    public:
        LLVMLayer();

        AST *ast;
        llvm::Module *module;
        llvm::IRBuilder<> builder;

        struct {
        llvm::Function* function = 0;
        } context;

        void moveToGarbage(void *o);

        llvm::Value *compile() const;

    private:
        std::vector<void *> __garbage;
    };
}
#endif // LLVMLAYER_H
