summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Andreas Benkard <matthias@benkard.de>2008-08-10 12:16:57 +0200
committerMatthias Andreas Benkard <matthias@benkard.de>2008-08-10 12:16:57 +0200
commitddf78cc594ae390a8bfff95555dc285c1bbd28f5 (patch)
tree773578f1bcd8f1b0d16170f4299f2f2134ad7c62
parent113c5905ecad09fa34a6440209b0814acf0012e3 (diff)
Modularise the compiler.
-rw-r--r--MLKForm.h176
-rw-r--r--MLKLLVMCompiler.h22
-rw-r--r--MLKLLVMCompiler.mm35
3 files changed, 215 insertions, 18 deletions
diff --git a/MLKForm.h b/MLKForm.h
new file mode 100644
index 0000000..ceafcb9
--- /dev/null
+++ b/MLKForm.h
@@ -0,0 +1,176 @@
+/* -*- 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 "MLKForm.h"
+#import "MLKLexicalContext.h"
+
+#import <Foundation/NSObject.h>
+#import <Foundation/NSString.h>
+
+
+@interface MLKForm : NSObject
+{
+ id _form;
+ MLKLexicalContext *_context;
+ id _compiler;
+}
+
+-(id) initWithObject:(id)object
+ inContext:(MLKLexicalContext *)context
+ forCompiler:(id)compiler;
+
+-(id) complete;
++(Class) dispatchClassForObject:(id)object;
+
++(id) formWithObject:(id)object
+ inContext:(MLKLexicalContext *)context
+ forCompiler:(id)compiler;
+@end
+
+
+@interface MLKAtomicForm : MLKForm
++(Class) dispatchClassForObject:(id)object;
+@end
+
+
+@interface MLKSelfEvaluatingForm : MLKAtomicForm
++(Class) dispatchClassForObject:(id)object;
+@end
+
+
+@interface MLKSymbolForm : MLKAtomicForm
++(Class) dispatchClassForObject:(id)object;
+@end
+
+
+@interface MLKCompoundForm : MLKForm
+{
+ id _head;
+ id _tail;
+}
+
+-(id) complete;
++(Class) dispatchClassForObject:(id)object;
+@end
+
+@interface MLKSimpleCompoundForm : MLKCompoundForm
+-(id) initWithObject:(id)object
+ inContext:(MLKLexicalContext *)context
+ forCompiler:(id)compiler;
+
++(Class) dispatchClassForObject:(id)object;
+@end
+
+
+@interface MLKMacroCallForm : MLKSimpleCompoundForm
+-(id) initWithObject:(id)object
+ inContext:(MLKLexicalContext *)context
+ forCompiler:(id)compiler;
+@end
+
+
+@interface MLKFunctionCallForm : MLKSimpleCompoundForm
+@end
+
+
+@interface MLKCatchForm : MLKCompoundForm
+@end
+
+
+@interface MLKSimpleDefmacroForm : MLKCompoundForm
+@end
+
+
+@interface MLKEvalWhenForm : MLKCompoundForm
+@end
+
+
+@interface MLKForeignLambdaForm : MLKCompoundForm
+@end
+
+
+@interface MLKFunctionForm : MLKCompoundForm
+@end
+
+
+@interface MLKIfForm : MLKCompoundForm
+@end
+
+
+@interface MLKInPackageForm : MLKCompoundForm
+@end
+
+
+@interface MLKSimpleLambdaForm : MLKCompoundForm
+@end
+
+
+@interface MLKSimpleMacroletForm : MLKCompoundForm
+@end
+
+
+@interface MLKSimpleFletForm : MLKCompoundForm
+@end
+
+
+@interface MLKLetForm : MLKCompoundForm
+@end
+
+
+@interface MLKSimpleLoopForm : MLKCompoundForm
+@end
+
+
+@interface MLKMultipleValueCallForm : MLKCompoundForm
+@end
+
+
+@interface MLKProgNForm : MLKCompoundForm
+@end
+
+
+@interface MLKProgVForm : MLKCompoundForm
+@end
+
+
+@interface MLKQuoteForm : MLKCompoundForm
+@end
+
+
+@interface MLKSetQForm : MLKCompoundForm
+@end
+
+
+@interface MLKFSetQForm : MLKCompoundForm
+@end
+
+
+@interface MLKSetForm : MLKCompoundForm
+@end
+
+
+@interface MLKFSetForm : MLKCompoundForm
+@end
+
+
+@interface MLKThrowForm : MLKCompoundForm
+@end
+
+
+@interface MLKUnwindProtectForm : MLKCompoundForm
+@end
diff --git a/MLKLLVMCompiler.h b/MLKLLVMCompiler.h
index 7b3569d..8ade89c 100644
--- a/MLKLLVMCompiler.h
+++ b/MLKLLVMCompiler.h
@@ -16,21 +16,33 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#import "MLKForm.h"
#import "MLKLexicalContext.h"
+#import <Foundation/NSObject.h>
#import <Foundation/NSString.h>
-/*
#ifdef __cplusplus
#include <Value.h>
#include <BasicBlock.h>
using namespace llvm;
#endif
-*/
-@interface MLKLLVMCompiler
--(id) compile:(id)object
+@interface MLKLLVMCompiler : NSObject
++(void) initialize;
+
++(id) compile:(id)object
inContext:(MLKLexicalContext *)context;
--(void) processTopLevelForm:(id)object;
++(void) processTopLevelForm:(id)object;
+
+#ifdef __cplusplus
++(Value *) processForm:(MLKForm *)form
+ inBlock:(BasicBlock **)block;
+#endif
+@end
+
+
+@interface MLKForm (MLKLLVMCompilation)
+-(Value *) processForLLVMInBlock:(BasicBlock **)block;
@end
diff --git a/MLKLLVMCompiler.mm b/MLKLLVMCompiler.mm
index 18efccb..fdb4844 100644
--- a/MLKLLVMCompiler.mm
+++ b/MLKLLVMCompiler.mm
@@ -40,23 +40,14 @@ static IRBuilder builder;
static FunctionPassManager *fpm;
-static BasicBlock *process (Value **value,
- id object,
- MLKLexicalContext *context,
- BasicBlock *block)
-{
-
-}
-
-
@implementation MLKLLVMCompiler
--(void) initialize
++(void) initialize
{
module = new llvm::Module ("MLKLLVMModule");
execution_engine = ExecutionEngine::create (module);
}
--(id) compile:(id)object
++(id) compile:(id)object
inContext:(MLKLexicalContext *)context
{
Value *v = NULL;
@@ -74,7 +65,10 @@ static BasicBlock *process (Value **value,
block = BasicBlock::Create ("entry", function);
builder.SetInsertPoint (block);
- process (&v, object, context, block);
+ v = [self processForm:[MLKForm formWithObject:object
+ inContext:context
+ forCompiler:self]
+ inBlock:&block];
builder.CreateRet (v);
verifyFunction (*function);
@@ -85,8 +79,23 @@ static BasicBlock *process (Value **value,
return fn ();
}
--(void) processTopLevelForm:(id)object
++(void) processTopLevelForm:(id)object
{
//FIXME
}
+
++(Value *) processForm:(MLKForm *)form
+ inBlock:(BasicBlock **)block
+{
+ return [form processForLLVMInBlock:block];
+}
+@end
+
+
+@implementation MLKForm (MLKLLVMCompilation)
+-(Value *) processForLLVMInBlock:(BasicBlock **)block
+{
+ NSLog (@"WARNING: Unrecognised form type: %@", self);
+ return NULL;
+}
@end