mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-11-03 14:21:30 +00:00 
			
		
		
		
	Sorry for the fallout here, I forgot the examples aren't built by default any more. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@171371 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			95 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
//===-- BrainF.h - BrainF compiler class ----------------------*- C++ -*-===//
 | 
						|
//
 | 
						|
//                     The LLVM Compiler Infrastructure
 | 
						|
//
 | 
						|
// This file 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/IR/IRBuilder.h"
 | 
						|
#include "llvm/IR/LLVMContext.h"
 | 
						|
#include "llvm/IR/Module.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 {
 | 
						|
  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;
 | 
						|
    Function *getchar_func;
 | 
						|
    Function *putchar_func;
 | 
						|
    Value *ptr_arr;
 | 
						|
    Value *ptr_arrmax;
 | 
						|
    BasicBlock *endbb;
 | 
						|
    BasicBlock *aberrorbb;
 | 
						|
 | 
						|
    /// Variables
 | 
						|
    IRBuilder<> *builder;
 | 
						|
    Value *curhead;
 | 
						|
};
 | 
						|
 | 
						|
#endif
 |