From 113c5905ecad09fa34a6440209b0814acf0012e3 Mon Sep 17 00:00:00 2001
From: Matthias Andreas Benkard <matthias@benkard.de>
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 <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
-- 
cgit v1.2.3