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/IR/IRBuilder.h" 19 #include "llvm/IR/LLVMContext.h" 20 #include "llvm/IR/Module.h" 21 22 using 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. 28 class 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