summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Andreas Benkard <matthias@benkard.de>2008-08-09 23:52:17 +0200
committerMatthias Andreas Benkard <matthias@benkard.de>2008-08-09 23:52:17 +0200
commit113c5905ecad09fa34a6440209b0814acf0012e3 (patch)
tree4724de75c6fc31f7e3bc648e7c06e12f9f5349e5
parenta48fab53957845b683ebd23f468cd45a4ce3829a (diff)
Beginnings of a compiler.
-rw-r--r--GNUmakefile7
-rw-r--r--MLKLLVMCompiler.h36
-rw-r--r--MLKLLVMCompiler.mm92
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