summaryrefslogtreecommitdiff
path: root/MLKLLVMCompiler.mm
diff options
context:
space:
mode:
Diffstat (limited to 'MLKLLVMCompiler.mm')
-rw-r--r--MLKLLVMCompiler.mm55
1 files changed, 46 insertions, 9 deletions
diff --git a/MLKLLVMCompiler.mm b/MLKLLVMCompiler.mm
index 81aa764..aba2bf1 100644
--- a/MLKLLVMCompiler.mm
+++ b/MLKLLVMCompiler.mm
@@ -17,6 +17,7 @@
*/
#import "MLKLLVMCompiler.h"
+#import "MLKPackage.h"
#import "globals.h"
#import "util.h"
@@ -381,23 +382,59 @@ static Constant
@implementation MLKFunctionCallForm (MLKLLVMCompilation)
-(Value *) processForLLVM
{
+ static MLKPackage *sys = [MLKPackage findPackage:@"TOILET-SYSTEM"];
+
+ BOOL special_dispatch = NO;
+ Value *functionCell;
+ Value *functionPtr;
+ Value *closureDataCell;
+ Value *closureDataPtr;
+ std::vector<Value *> args;
+
if (![_context symbolNamesFunction:_head])
{
- NSLog (@"Compiler: Don't know function %@", MLKPrintToString(_head));
- // XXX Issue a style warning.
+ if (_head && [_head homePackage] == sys)
+ {
+ special_dispatch = YES;
+ }
+ else
+ {
+ NSLog (@"Compiler: Don't know function %@", MLKPrintToString(_head));
+ // XXX Issue a style warning.
+ }
}
- Value *functionCell = builder.Insert ([_context functionCellValueForSymbol:_head]);
- Value *functionPtr = builder.CreateLoad (functionCell);
- Value *closureDataCell = builder.Insert ([_context closureDataPointerValueForSymbol:_head]);
- Value *closureDataPtr = builder.CreateLoad (closureDataCell);
+ if (!special_dispatch)
+ {
+ functionCell = builder.Insert ([_context functionCellValueForSymbol:_head]);
+ functionPtr = builder.CreateLoad (functionCell);
+ closureDataCell = builder.Insert ([_context closureDataPointerValueForSymbol:_head]);
+ closureDataPtr = builder.CreateLoad (closureDataCell);
+
+ args.push_back (closureDataPtr);
+ }
+ else
+ {
+ std::vector<const Type *> argtypes (1, PointerTy);
+ functionPtr = builder.CreateIntToPtr (ConstantInt::get(Type::Int64Ty,
+ (uint64_t)MLKDispatchRootFunction,
+ false),
+ PointerType::get (FunctionType::get (PointerTy,
+ argtypes,
+ true),
+ 0));
+ LRETAIN (_head); // FIXME: release sometime? On the other hand,
+ // these symbols will probably never be
+ // deallocated anyway.
+ args.push_back (builder.CreateIntToPtr (ConstantInt::get(Type::Int64Ty,
+ (uint64_t)_head,
+ false),
+ PointerTy));
+ }
NSEnumerator *e = [_argumentForms objectEnumerator];
MLKForm *form;
- std::vector<Value *> args;
- args.push_back (closureDataPtr);
-
while ((form = [e nextObject]))
{
args.push_back ([form processForLLVM]);