diff options
author | Matthias Andreas Benkard <matthias@benkard.de> | 2008-08-12 14:29:38 +0200 |
---|---|---|
committer | Matthias Andreas Benkard <matthias@benkard.de> | 2008-08-12 14:29:38 +0200 |
commit | 881d4f5cf7e85b87ed0f3bd55fd1542a7ca743f4 (patch) | |
tree | e9e05269914510bee3bf708917c5fa980e383ac8 | |
parent | dfe50b2e72ddbd0148870748975f00e7fc662314 (diff) |
LLVM compiler: Insert value names into the assembly code.
-rw-r--r-- | MLKLLVMCompiler.h | 16 | ||||
-rw-r--r-- | MLKLLVMCompiler.mm | 63 |
2 files changed, 61 insertions, 18 deletions
diff --git a/MLKLLVMCompiler.h b/MLKLLVMCompiler.h index a57a33f..4f167bb 100644 --- a/MLKLLVMCompiler.h +++ b/MLKLLVMCompiler.h @@ -24,6 +24,7 @@ #import <Foundation/NSString.h> #ifdef __cplusplus +#include <vector> #include <llvm/Value.h> #include <llvm/BasicBlock.h> using namespace llvm; @@ -42,8 +43,23 @@ using namespace llvm; #ifdef __cplusplus +(Value *) processForm:(MLKForm *)form; ++(Value *) insertSelectorLookup:(NSString *)name; + ++(Value *) insertMethodCall:(NSString *)messageName + onObject:(Value *)object + withArgumentVector:(std::vector<Value*> *)argv; ++(Value *) insertMethodCall:(NSString *)messageName + onObject:(Value *)object + withArgumentVector:(std::vector<Value*> *)argv + name:(NSString *)name; + +(Value *) insertMethodCall:(NSString *)messageName onObject:(Value *)object; ++(Value *) insertMethodCall:(NSString *)messageName + onObject:(Value *)object + withName:(NSString *)name; + ++(Value *) insertClassLookup:(NSString *)className; #endif @end diff --git a/MLKLLVMCompiler.mm b/MLKLLVMCompiler.mm index e31f032..794f1ac 100644 --- a/MLKLLVMCompiler.mm +++ b/MLKLLVMCompiler.mm @@ -146,13 +146,24 @@ static Constant NULL); Constant *nameptr = createGlobalStringPtr ([name UTF8String]); - return builder.CreateCall (function, nameptr); + return builder.CreateCall (function, nameptr, "selector"); } +(Value *) insertMethodCall:(NSString *)messageName onObject:(Value *)object withArgumentVector:(std::vector<Value*> *)argv { + return [self insertMethodCall:messageName + onObject:object + withArgumentVector:argv + name:@""]; +} + ++(Value *) insertMethodCall:(NSString *)messageName + onObject:(Value *)object + withArgumentVector:(std::vector<Value*> *)argv + name:(NSString *)name; +{ std::vector <const Type *> argtypes (2, PointerTy); FunctionType *ftype = FunctionType::get (PointerTy, argtypes, true); Constant *function = @@ -167,18 +178,28 @@ static Constant Value *sel = [self insertSelectorLookup:messageName]; std::deque <Value *> argd (argv->begin(), argv->end()); - argd.push_front (object); argd.push_front (sel); + argd.push_front (object); return builder.CreateCall (function, argd.begin(), argd.end()); } +(Value *) insertMethodCall:(NSString *)messageName onObject:(Value *)object + withName:(NSString *)name { std::vector<Value*> argv; return [self insertMethodCall:messageName onObject:object - withArgumentVector:&argv]; + withArgumentVector:&argv + name:name]; +} + ++(Value *) insertMethodCall:(NSString *)messageName + onObject:(Value *)object +{ + return [self insertMethodCall:messageName + onObject:object + withName:@""]; } +(Value *) insertClassLookup:(NSString *)className @@ -194,9 +215,11 @@ static Constant PointerTy, NULL); - // Value *nameptr = builder.CreateGlobalStringPtr ([className UTF8String], ""); - Constant *nameptr = createGlobalStringPtr ([className UTF8String]); - return builder.CreateCall (function, nameptr); + const char *cname = [className UTF8String]; + + // Value *nameptr = builder.CreateGlobalStringPtr (cname, ""); + Constant *nameptr = createGlobalStringPtr (cname); + return builder.CreateCall (function, nameptr, cname); } @end @@ -331,11 +354,15 @@ static Constant "", module); + Function::arg_iterator args = function->arg_begin(); + Value *closure_data_arg = args++; + closure_data_arg->setName ("closure_data"); + BasicBlock *outerBlock = builder.GetInsertBlock (); BasicBlock *initBlock = BasicBlock::Create ("init_function", function); BasicBlock *loopBlock = BasicBlock::Create ("load_args"); - BasicBlock *loopInitBlock = BasicBlock::Create ("load_args_init"); - BasicBlock *joinBlock = BasicBlock::Create ("after_load_args"); + BasicBlock *loopInitBlock = BasicBlock::Create ("load_args_prelude"); + BasicBlock *joinBlock = BasicBlock::Create ("function_body"); builder.SetInsertPoint (initBlock); @@ -344,7 +371,7 @@ static Constant false), PointerType::get(Type::Int8Ty, 0)); - Value *ap = builder.CreateAlloca (Type::Int8Ty); + Value *ap = builder.CreateAlloca (Type::Int8Ty, NULL, "ap"); builder.CreateCall (module->getOrInsertFunction ("llvm.va_start", Type::VoidTy, @@ -354,7 +381,7 @@ static Constant Value *nsmutablearray = [_compiler insertClassLookup:@"NSMutableArray"]; Value *mlkcons = [_compiler insertClassLookup:@"MLKCons"]; - Value *lambdaList = builder.CreateAlloca (PointerType::get (Type::Int8Ty, 0)); + Value *lambdaList = builder.CreateAlloca (PointerTy, NULL, "lambda_list"); builder.CreateStore ([_compiler insertMethodCall:@"array" onObject:nsmutablearray], @@ -364,7 +391,7 @@ static Constant builder.SetInsertPoint (loopInitBlock); function->getBasicBlockList().push_back (loopInitBlock); - Value *arg = builder.CreateVAArg (ap, PointerType::get(Type::Int8Ty, 0)); + Value *arg = builder.CreateVAArg (ap, PointerType::get(Type::Int8Ty, 0), "arg"); Value *cond = builder.CreateICmpEQ (arg, endmarker); builder.CreateCondBr (cond, joinBlock, loopBlock); builder.SetInsertPoint (loopBlock); @@ -392,8 +419,6 @@ static Constant withArgumentVector:&argv], lambdaList); - function->dump(); - NSEnumerator *e = [_bodyForms objectEnumerator]; MLKForm *form; Value *value = NULL; @@ -401,7 +426,7 @@ static Constant if ([_bodyForms count] == 0) { //NSLog (@"%LAMBDA: No body."); - value = ConstantPointerNull::get (PointerType::get(Type::Int8Ty, 0)); + value = ConstantPointerNull::get (PointerTy); } while ((form = [e nextObject])) @@ -413,7 +438,9 @@ static Constant builder.CreateRet (value); function->dump(); + NSLog (@"Verify..."); verifyFunction (*function); + NSLog (@"FPM..."); fpm->run (*function); builder.SetInsertPoint (outerBlock); @@ -425,10 +452,10 @@ static Constant Value *mlkcompiledclosure = [_compiler insertClassLookup:@"MLKCompiledClosure"]; Value *closure = - builder.CreateStore ([_compiler insertMethodCall:@"closureWithCode:data:" - onObject:mlkcompiledclosure - withArgumentVector:&argv], - lambdaList); + [_compiler insertMethodCall:@"closureWithCode:data:" + onObject:mlkcompiledclosure + withArgumentVector:&argv]; + outerBlock->dump(); return closure; } |