[llvm-exegesis][NFC] moving code around.
[llvm-complete.git] / examples / BrainF / BrainF.h
blob587be141b98f0728ae7b49a27aa9ce10228e47f6
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.
13 //===----------------------------------------------------------------------===//
15 #ifndef BRAINF_H
16 #define BRAINF_H
18 #include "llvm/IR/IRBuilder.h"
19 #include "llvm/IR/LLVMContext.h"
20 #include "llvm/IR/Module.h"
21 #include <istream>
23 using namespace llvm;
25 /// This class provides a parser for the BrainF language.
26 /// The class itself is made to store values during
27 /// parsing so they don't have to be passed around
28 /// as much.
29 class BrainF {
30 public:
31 /// Options for how BrainF should compile
32 enum CompileFlags {
33 flag_off = 0,
34 flag_arraybounds = 1
37 /// This is the main method. It parses BrainF from in1
38 /// and returns the module with a function
39 /// void brainf()
40 /// containing the resulting code.
41 /// On error, it calls abort.
42 /// The caller must delete the returned module.
43 Module *parse(std::istream *in1, int mem, CompileFlags cf,
44 LLVMContext& C);
46 protected:
47 /// The different symbols in the BrainF language
48 enum Symbol {
49 SYM_NONE,
50 SYM_READ,
51 SYM_WRITE,
52 SYM_MOVE,
53 SYM_CHANGE,
54 SYM_LOOP,
55 SYM_ENDLOOP,
56 SYM_EOF
59 /// Names of the different parts of the language.
60 /// Tape is used for reading and writing the tape.
61 /// headreg is used for the position of the head.
62 /// label is used for the labels for the BasicBlocks.
63 /// testreg is used for testing the loop exit condition.
64 static const char *tapereg;
65 static const char *headreg;
66 static const char *label;
67 static const char *testreg;
69 /// Put the brainf function preamble and other fixed pieces of code
70 void header(LLVMContext& C);
72 /// The main loop for parsing. It calls itself recursively
73 /// to handle the depth of nesting of "[]".
74 void readloop(PHINode *phi, BasicBlock *oldbb,
75 BasicBlock *testbb, LLVMContext &Context);
77 /// Constants during parsing
78 int memtotal;
79 CompileFlags comflag;
80 std::istream *in;
81 Module *module;
82 Function *brainf_func;
83 Function *getchar_func;
84 Function *putchar_func;
85 Value *ptr_arr;
86 Value *ptr_arrmax;
87 BasicBlock *endbb;
88 BasicBlock *aberrorbb;
90 /// Variables
91 IRBuilder<> *builder;
92 Value *curhead;
95 #endif // BRAINF_H