blob: 03eedbc3a2530ba5ab9916108f2f83910f977b00 [file] [log] [blame]
//===-- BrainF.h - BrainF compiler class ----------------------*- C++ -*-===//
// The LLVM Compiler Infrastructure
// This file was developed by Sterling Stein and is distributed under the
// University of Illinois Open Source License. See LICENSE.TXT for details.
// 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/Module.h"
#include "llvm/Support/LLVMBuilder.h"
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 {
/// 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);
/// The different symbols in the BrainF language
enum Symbol {
/// 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();
/// The main loop for parsing. It calls itself recursively
/// to handle the depth of nesting of "[]".
void readloop(PHINode *phi, BasicBlock *oldbb, BasicBlock *testbb);
/// Constants during parsing
int memtotal;
CompileFlags comflag;
std::istream *in;
Module *module;
Function *brainf_func;
Function *getchar_func;
Function *putchar_func;
Value *ptr_arr;
Value *ptr_arrmax;
BasicBlock *endbb;
BasicBlock *aberrorbb;
/// Variables
LLVMBuilder *builder;
Value *curhead;