From 113c5905ecad09fa34a6440209b0814acf0012e3 Mon Sep 17 00:00:00 2001 From: Matthias Andreas Benkard Date: Sat, 9 Aug 2008 23:52:17 +0200 Subject: Beginnings of a compiler. --- GNUmakefile | 7 +++++ MLKLLVMCompiler.h | 36 +++++++++++++++++++++ MLKLLVMCompiler.mm | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 135 insertions(+) create mode 100644 MLKLLVMCompiler.h create mode 100644 MLKLLVMCompiler.mm 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 . + */ + +#import "MLKLexicalContext.h" + +#import + +/* +#ifdef __cplusplus +#include +#include +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 . + */ + +#import "MLKLLVMCompiler.h" + +#import +#import + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +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 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 -- cgit v1.2.3