1//===-- BrainF.h - BrainF compiler class ----------------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===--------------------------------------------------------------------===//
9//
10// This class stores the data for the BrainF compiler so it doesn't have
11// to pass all of it around.  The main method is parse.
12//
13//===--------------------------------------------------------------------===//
14
15#ifndef BRAINF_H
16#define BRAINF_H
17
18#include "llvm/IRBuilder.h"
19#include "llvm/LLVMContext.h"
20#include "llvm/Module.h"
21
22using namespace llvm;
23
24/// This class provides a parser for the BrainF language.
25/// The class itself is made to store values during
26/// parsing so they don't have to be passed around
27/// as much.
28class BrainF {
29  public:
30    /// Options for how BrainF should compile
31    enum CompileFlags {
32      flag_off         = 0,
33      flag_arraybounds = 1
34    };
35
36    /// This is the main method.  It parses BrainF from in1
37    /// and returns the module with a function
38    /// void brainf()
39    /// containing the resulting code.
40    /// On error, it calls abort.
41    /// The caller must delete the returned module.
42    Module *parse(std::istream *in1, int mem, CompileFlags cf,
43                  LLVMContext& C);
44
45  protected:
46    /// The different symbols in the BrainF language
47    enum Symbol {
48      SYM_NONE,
49      SYM_READ,
50      SYM_WRITE,
51      SYM_MOVE,
52      SYM_CHANGE,
53      SYM_LOOP,
54      SYM_ENDLOOP,
55      SYM_EOF
56    };
57
58    /// Names of the different parts of the language.
59    /// Tape is used for reading and writing the tape.
60    /// headreg is used for the position of the head.
61    /// label is used for the labels for the BasicBlocks.
62    /// testreg is used for testing the loop exit condition.
63    static const char *tapereg;
64    static const char *headreg;
65    static const char *label;
66    static const char *testreg;
67
68    /// Put the brainf function preamble and other fixed pieces of code
69    void header(LLVMContext& C);
70
71    /// The main loop for parsing.  It calls itself recursively
72    /// to handle the depth of nesting of "[]".
73    void readloop(PHINode *phi, BasicBlock *oldbb,
74                  BasicBlock *testbb, LLVMContext &Context);
75
76    /// Constants during parsing
77    int memtotal;
78    CompileFlags comflag;
79    std::istream *in;
80    Module *module;
81    Function *brainf_func;
82    Function *getchar_func;
83    Function *putchar_func;
84    Value *ptr_arr;
85    Value *ptr_arrmax;
86    BasicBlock *endbb;
87    BasicBlock *aberrorbb;
88
89    /// Variables
90    IRBuilder<> *builder;
91    Value *curhead;
92};
93
94#endif
95