diff options
| -rw-r--r-- | GNUmakefile | 7 | ||||
| -rw-r--r-- | MLKLLVMCompiler.h | 36 | ||||
| -rw-r--r-- | MLKLLVMCompiler.mm | 92 | 
3 files changed, 135 insertions, 0 deletions
| diff --git a/GNUmakefile b/GNUmakefile index 0cb2e7f..cff81a7 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -70,6 +70,13 @@ ToiletKit_OBJCFLAGS = -Wall  ToiletKit_LDFLAGS = -lgmp -lffi -ldl  #LIBRARIES_DEPEND_UPON +USE_LLVM := YES +ifeq ($(USE_LLVM),YES) +ToiletKit_OBJCC_FILES = MLKLLVMCompiler.mm +ToiletKit_OBJCCFLAGS = `llvm-config --cflags` +ToiletKit_LDFLAGS += `llvm-config --ldflags` `llvm-config --libs` +endif +  #TOOL_NAME = etoilet  #etoilet_OBJC_FILES = main.m  #etoilet_OBJC_LIBS = -lToiletKit -LToiletKit.framework diff --git a/MLKLLVMCompiler.h b/MLKLLVMCompiler.h new file mode 100644 index 0000000..7b3569d --- /dev/null +++ b/MLKLLVMCompiler.h @@ -0,0 +1,36 @@ +/* -*- mode: objc; coding: utf-8 -*- */ +/* Toilet Lisp, a Common Lisp subset for the Étoilé runtime. + * Copyright (C) 2008  Matthias Andreas Benkard. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program.  If not, see <http://www.gnu.org/licenses/>. + */ + +#import "MLKLexicalContext.h" + +#import <Foundation/NSString.h> + +/* +#ifdef __cplusplus +#include <Value.h> +#include <BasicBlock.h> +using namespace llvm; +#endif +*/ + +@interface MLKLLVMCompiler +-(id) compile:(id)object +    inContext:(MLKLexicalContext *)context; + +-(void) processTopLevelForm:(id)object; +@end diff --git a/MLKLLVMCompiler.mm b/MLKLLVMCompiler.mm new file mode 100644 index 0000000..18efccb --- /dev/null +++ b/MLKLLVMCompiler.mm @@ -0,0 +1,92 @@ +/* -*- mode: objc; coding: utf-8 -*- */ +/* Toilet Lisp, a Common Lisp subset for the Étoilé runtime. + * Copyright (C) 2008  Matthias Andreas Benkard. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program.  If not, see <http://www.gnu.org/licenses/>. + */ + +#import "MLKLLVMCompiler.h" + +#import <Foundation/NSArray.h> +#import <Foundation/NSString.h> + +#include <Analysis/Verifier.h> +#include <BasicBlock.h> +#include <DerivedTypes.h> +#include <ExecutionEngine/ExecutionEngine.h> +#include <Module.h> +#include <ModuleProvider.h> +#include <PassManager.h> +#include <Support/IRBuilder.h> +#include <Value.h> + +using namespace llvm; + + +static ExecutionEngine *execution_engine; +static llvm::Module *module; +static IRBuilder builder; +static FunctionPassManager *fpm; + + +static BasicBlock *process (Value **value, +                            id object, +                            MLKLexicalContext *context, +                            BasicBlock *block) +{ +   +} + + +@implementation MLKLLVMCompiler +-(void) initialize +{ +  module = new llvm::Module ("MLKLLVMModule"); +  execution_engine = ExecutionEngine::create (module); +} + +-(id) compile:(id)object +    inContext:(MLKLexicalContext *)context +{ +  Value *v = NULL; +  BasicBlock *block; +  std::vector<const Type*> noargs (0, Type::VoidTy); +  FunctionType *function_type = FunctionType::get (PointerType::get (Type::VoidTy, 0), +                                                   noargs, +                                                   false); +  Function *function = Function::Create (function_type, +                                         Function::ExternalLinkage, +                                         "", +                                         module); +  id (*fn)(); + +  block = BasicBlock::Create ("entry", function); +  builder.SetInsertPoint (block); + +  process (&v, object, context, block); + +  builder.CreateRet (v); +  verifyFunction (*function); +  fpm->run (*function); + +  // JIT-compile. +  fn = (id (*)()) execution_engine->getPointerToFunction (function); +  return fn (); +} + +-(void) processTopLevelForm:(id)object +{ +  //FIXME +} +@end | 
