//===-- BrainF.h - BrainF compiler class ------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This class stores the data for the BrainF compiler so it doesn't have // to pass all of it around. The main method is parse. // //===----------------------------------------------------------------------===// #ifndef BRAINF_H #define BRAINF_H #include "llvm/IR/IRBuilder.h" #include "llvm/IR/LLVMContext.h" #include "llvm/IR/Module.h" #include using namespace llvm; /// This class provides a parser for the BrainF language. /// The class itself is made to store values during /// parsing so they don't have to be passed around /// as much. class BrainF { public: /// Options for how BrainF should compile enum CompileFlags { flag_off = 0, flag_arraybounds = 1 }; /// This is the main method. It parses BrainF from in1 /// and returns the module with a function /// void brainf() /// containing the resulting code. /// On error, it calls abort. /// The caller must delete the returned module. Module *parse(std::istream *in1, int mem, CompileFlags cf, LLVMContext& C); protected: /// The different symbols in the BrainF language enum Symbol { SYM_NONE, SYM_READ, SYM_WRITE, SYM_MOVE, SYM_CHANGE, SYM_LOOP, SYM_ENDLOOP, SYM_EOF }; /// Names of the different parts of the language. /// Tape is used for reading and writing the tape. /// headreg is used for the position of the head. /// label is used for the labels for the BasicBlocks. /// testreg is used for testing the loop exit condition. static const char *tapereg; static const char *headreg; static const char *label; static const char *testreg; /// Put the brainf function preamble and other fixed pieces of code void header(LLVMContext& C); /// The main loop for parsing. It calls itself recursively /// to handle the depth of nesting of "[]". void readloop(PHINode *phi, BasicBlock *oldbb, BasicBlock *testbb, LLVMContext &Context); /// Constants during parsing int memtotal; CompileFlags comflag; std::istream *in; Module *module; Function *brainf_func; FunctionCallee getchar_func; FunctionCallee putchar_func; Value *ptr_arr; Value *ptr_arrmax; BasicBlock *endbb; BasicBlock *aberrorbb; /// Variables IRBuilder<> *builder; Value *curhead; }; #endif // BRAINF_H