summaryrefslogtreecommitdiff
path: root/MLKLLVMCompiler.mm
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 /MLKLLVMCompiler.mm
parent113c5905ecad09fa34a6440209b0814acf0012e3 (diff)
Modularise the compiler.
Diffstat (limited to 'MLKLLVMCompiler.mm')
-rw-r--r--MLKLLVMCompiler.mm35
1 files changed, 22 insertions, 13 deletions
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