diff options
author | Matthias Andreas Benkard <matthias@benkard.de> | 2008-08-09 23:52:17 +0200 |
---|---|---|
committer | Matthias Andreas Benkard <matthias@benkard.de> | 2008-08-09 23:52:17 +0200 |
commit | 113c5905ecad09fa34a6440209b0814acf0012e3 (patch) | |
tree | 4724de75c6fc31f7e3bc648e7c06e12f9f5349e5 | |
parent | a48fab53957845b683ebd23f468cd45a4ce3829a (diff) |
Beginnings of a compiler.
-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 |