Skip to content

Commit

Permalink
first test for compiling llvm asm code to dylib
Browse files Browse the repository at this point in the history
  • Loading branch information
mpw committed Dec 25, 2013
1 parent dac1dc3 commit d80177f
Show file tree
Hide file tree
Showing 6 changed files with 76 additions and 16 deletions.
3 changes: 3 additions & 0 deletions .gitignore
@@ -1,2 +1,5 @@
.svn
CVS
ObjectiveSmalltalk.xcodeproj/xcuserdata/
.o
.dylib
10 changes: 8 additions & 2 deletions Classes/MPWBridgeReader.m
Expand Up @@ -106,11 +106,17 @@ @implementation MPWEvaluator(loadFramework)
return bundle;
}

-(BOOL)dlopen:(NSString*)name
-(void*)dlopen:(NSString*)name
{
void *ptr=dlopen([name fileSystemRepresentation], RTLD_NOW);
return ptr != NULL;
return ptr;
}

-(int)dlclose:(void*)handle
{
return dlclose(handle);
}


@end

55 changes: 50 additions & 5 deletions ObjSTNative/MPWCodeGenerator.mm
Expand Up @@ -6,13 +6,47 @@
//
//

#include "llvmincludes.h"
//#include "llvmincludes.h"

#import "MPWCodeGenerator.h"

#import <dlfcn.h>

@implementation MPWCodeGenerator



+(NSString*)createTempDylibName
{
char *templatename="/tmp/testdylibXXXXXXXX";
char *theTemplate = strdup(templatename);
NSString *name=nil;
if ( mktemp( theTemplate) ) {
name=[NSString stringWithUTF8String:theTemplate];
}
free( theTemplate);
return name;
}

-(BOOL)assembleAndLoad:(NSData*)llvmAssemblySource
{
NSString *name=[[self class] createTempDylibName];
NSString *ofile_name=[name stringByAppendingPathExtension:@"o"];
NSString *dylib=[name stringByAppendingPathExtension:@"dylib"];
NSString *source_name=[name stringByAppendingPathExtension:@"s"];
[llvmAssemblySource writeToFile:source_name atomically:YES];
NSString *asm_to_o=[NSString stringWithFormat:@"/usr/local/bin/llc -filetype=obj %@ -o %@",source_name,ofile_name];
NSString *o_to_dylib=[NSString stringWithFormat:@"ld -macosx_version_min 10.8 -dylib -o %@ %@ -framework Foundation",dylib,ofile_name];
system([asm_to_o fileSystemRepresentation] );
system([o_to_dylib fileSystemRepresentation]);
unlink([source_name fileSystemRepresentation]);
unlink([ofile_name fileSystemRepresentation]);
void *handle = dlopen( [dylib fileSystemRepresentation], RTLD_NOW);
unlink([dylib fileSystemRepresentation]);
return handle!=NULL;

}


@end

#import <MPWFoundation/MPWFoundation.h>
Expand All @@ -29,15 +63,26 @@ @implementation MPWCodeGeneratorTestClass

@implementation MPWCodeGenerator(testing)

+(void)testMessageSend


+(void)testStaticEmptyClassDefine
{
// EXPECTTRUE(false, @"");
MPWCodeGenerator *codegen=[[self new] autorelease];
NSString *classname=@"EmptyCodeGenTestClass01";
NSData *source=[[NSBundle bundleForClass:self] resourceWithName:@"empty-class" type:@"llvm-templateasm"];
EXPECTNIL(NSClassFromString(classname), @"test class should not exist before load");
EXPECTNOTNIL(source, @"should have source data");
EXPECTTRUE([codegen assembleAndLoad:source],@"codegen");

EXPECTNOTNIL(NSClassFromString(classname), @"test class should xist after load");
}


+testSelectors
{
return @[ @"testMessageSend" ];
return @[
@"testStaticEmptyClassDefine"
];
}

@end
Expand Up @@ -17,14 +17,14 @@ target triple = "x86_64-apple-macosx10.9.0"
@_objc_empty_cache = external global %struct._objc_cache
@_objc_empty_vtable = external global i8* (i8*, i8*)*
@"OBJC_METACLASS_$_NSObject" = external global %struct._class_t
@"\01L_OBJC_CLASS_NAME_" = internal global [3 x i8] c"Hi\00", section "__TEXT,__objc_classname,cstring_literals", align 1
@"\01l_OBJC_METACLASS_RO_$_Hi" = internal global %struct._class_ro_t { i32 1, i32 40, i32 40, i8* null, i8* getelementptr inbounds ([3 x i8]* @"\01L_OBJC_CLASS_NAME_", i32 0, i32 0), %struct.__method_list_t* null, %struct._objc_protocol_list* null, %struct._ivar_list_t* null, i8* null, %struct._prop_list_t* null }, section "__DATA, __objc_const", align 8
@"OBJC_METACLASS_$_Hi" = global %struct._class_t { %struct._class_t* @"OBJC_METACLASS_$_NSObject", %struct._class_t* @"OBJC_METACLASS_$_NSObject", %struct._objc_cache* @_objc_empty_cache, i8* (i8*, i8*)** @_objc_empty_vtable, %struct._class_ro_t* @"\01l_OBJC_METACLASS_RO_$_Hi" }, section "__DATA, __objc_data", align 8
@"\01L_OBJC_CLASS_NAME_" = internal global [24 x i8] c"EmptyCodeGenTestClass01\00", section "__TEXT,__objc_classname,cstring_literals", align 1
@"\01l_OBJC_METACLASS_RO_$_EmptyCodeGenTestClass01" = internal global %struct._class_ro_t { i32 1, i32 40, i32 40, i8* null, i8* getelementptr inbounds ([24 x i8]* @"\01L_OBJC_CLASS_NAME_", i32 0, i32 0), %struct.__method_list_t* null, %struct._objc_protocol_list* null, %struct._ivar_list_t* null, i8* null, %struct._prop_list_t* null }, section "__DATA, __objc_const", align 8
@"OBJC_METACLASS_$_EmptyCodeGenTestClass01" = global %struct._class_t { %struct._class_t* @"OBJC_METACLASS_$_NSObject", %struct._class_t* @"OBJC_METACLASS_$_NSObject", %struct._objc_cache* @_objc_empty_cache, i8* (i8*, i8*)** @_objc_empty_vtable, %struct._class_ro_t* @"\01l_OBJC_METACLASS_RO_$_EmptyCodeGenTestClass01" }, section "__DATA, __objc_data", align 8
@"OBJC_CLASS_$_NSObject" = external global %struct._class_t
@"\01l_OBJC_CLASS_RO_$_Hi" = internal global %struct._class_ro_t { i32 0, i32 8, i32 8, i8* null, i8* getelementptr inbounds ([3 x i8]* @"\01L_OBJC_CLASS_NAME_", i32 0, i32 0), %struct.__method_list_t* null, %struct._objc_protocol_list* null, %struct._ivar_list_t* null, i8* null, %struct._prop_list_t* null }, section "__DATA, __objc_const", align 8
@"OBJC_CLASS_$_Hi" = global %struct._class_t { %struct._class_t* @"OBJC_METACLASS_$_Hi", %struct._class_t* @"OBJC_CLASS_$_NSObject", %struct._objc_cache* @_objc_empty_cache, i8* (i8*, i8*)** @_objc_empty_vtable, %struct._class_ro_t* @"\01l_OBJC_CLASS_RO_$_Hi" }, section "__DATA, __objc_data", align 8
@"\01L_OBJC_LABEL_CLASS_$" = internal global [1 x i8*] [i8* bitcast (%struct._class_t* @"OBJC_CLASS_$_Hi" to i8*)], section "__DATA, __objc_classlist, regular, no_dead_strip", align 8
@llvm.used = appending global [2 x i8*] [i8* getelementptr inbounds ([3 x i8]* @"\01L_OBJC_CLASS_NAME_", i32 0, i32 0), i8* bitcast ([1 x i8*]* @"\01L_OBJC_LABEL_CLASS_$" to i8*)], section "llvm.metadata"
@"\01l_OBJC_CLASS_RO_$_EmptyCodeGenTestClass01" = internal global %struct._class_ro_t { i32 0, i32 8, i32 8, i8* null, i8* getelementptr inbounds ([24 x i8]* @"\01L_OBJC_CLASS_NAME_", i32 0, i32 0), %struct.__method_list_t* null, %struct._objc_protocol_list* null, %struct._ivar_list_t* null, i8* null, %struct._prop_list_t* null }, section "__DATA, __objc_const", align 8
@"OBJC_CLASS_$_EmptyCodeGenTestClass01" = global %struct._class_t { %struct._class_t* @"OBJC_METACLASS_$_EmptyCodeGenTestClass01", %struct._class_t* @"OBJC_CLASS_$_NSObject", %struct._objc_cache* @_objc_empty_cache, i8* (i8*, i8*)** @_objc_empty_vtable, %struct._class_ro_t* @"\01l_OBJC_CLASS_RO_$_EmptyCodeGenTestClass01" }, section "__DATA, __objc_data", align 8
@"\01L_OBJC_LABEL_CLASS_$" = internal global [1 x i8*] [i8* bitcast (%struct._class_t* @"OBJC_CLASS_$_EmptyCodeGenTestClass01" to i8*)], section "__DATA, __objc_classlist, regular, no_dead_strip", align 8
@llvm.used = appending global [2 x i8*] [i8* getelementptr inbounds ([24 x i8]* @"\01L_OBJC_CLASS_NAME_", i32 0, i32 0), i8* bitcast ([1 x i8*]* @"\01L_OBJC_LABEL_CLASS_$" to i8*)], section "llvm.metadata"

!llvm.module.flags = !{!0, !1, !2, !3}

Expand Down
4 changes: 2 additions & 2 deletions ObjSTNative/test-compiles/empty-class.m
@@ -1,6 +1,6 @@
#import <Foundation/Foundation.h>

@interface Hi : NSObject {} @end
@implementation Hi
@interface EmptyCodeGenTestClass01 : NSObject {} @end
@implementation EmptyCodeGenTestClass01

@end
6 changes: 6 additions & 0 deletions ObjectiveSmalltalk.xcodeproj/project.pbxproj
Expand Up @@ -336,6 +336,8 @@
1FBAAC1E184BDC6400086047 /* stsh.1 in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1FBAAC1D184BDC6400086047 /* stsh.1 */; };
1FBAAC27184BDD8200086047 /* ObjectiveSmalltalk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F5E508F09B4B754000298D9 /* ObjectiveSmalltalk.framework */; };
1FBAAC28184BDD8900086047 /* MPWFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F50B9CF05AC60E200A22012 /* MPWFoundation.framework */; };
1FC2EEF2186B653000B3D06F /* empty-class.llvm-templateasm in Sources */ = {isa = PBXBuildFile; fileRef = 1FC2EEF1186B653000B3D06F /* empty-class.llvm-templateasm */; };
1FC2EEF3186B670F00B3D06F /* empty-class.llvm-templateasm in Resources */ = {isa = PBXBuildFile; fileRef = 1FC2EEF1186B653000B3D06F /* empty-class.llvm-templateasm */; };
1FC364E11764E0BD00CD2C43 /* MPWVarScheme.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F4FD0EB10E4FEFA00934A17 /* MPWVarScheme.h */; };
1FC8F835181BF3A3003980D8 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2E6EFD142EF26E00B5C827 /* Cocoa.framework */; };
1FC8F83B181BF3A3003980D8 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1FC8F839181BF3A3003980D8 /* InfoPlist.strings */; };
Expand Down Expand Up @@ -636,6 +638,7 @@
1FBAAC58184BE03500086047 /* libedit.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libedit.dylib; path = usr/lib/libedit.dylib; sourceTree = SDKROOT; };
1FBAAC5A184BE03B00086047 /* libncurses.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libncurses.dylib; path = usr/lib/libncurses.dylib; sourceTree = SDKROOT; };
1FBAD8131436297C0050D6DE /* MPWFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MPWFoundation.framework; path = "../../../Library/Developer/Xcode/DerivedData/metaproducts-frbgyznjeqtcxocedsnxdniqbnzz/Build/Products/Development/MPWFoundation.framework"; sourceTree = "<group>"; };
1FC2EEF1186B653000B3D06F /* empty-class.llvm-templateasm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "empty-class.llvm-templateasm"; path = "test-compiles/empty-class.llvm-templateasm"; sourceTree = "<group>"; };
1FC8F834181BF3A3003980D8 /* SchemeFUSE.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SchemeFUSE.framework; sourceTree = BUILT_PRODUCTS_DIR; };
1FC8F838181BF3A3003980D8 /* SchemeFUSE-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "SchemeFUSE-Info.plist"; sourceTree = "<group>"; };
1FC8F83A181BF3A3003980D8 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
Expand Down Expand Up @@ -843,6 +846,7 @@
1F084A1116DCE6A200ED2517 /* Supporting Files */ = {
isa = PBXGroup;
children = (
1FC2EEF1186B653000B3D06F /* empty-class.llvm-templateasm */,
1F084A1216DCE6A200ED2517 /* ObjSTNative-Info.plist */,
1F084A1316DCE6A200ED2517 /* InfoPlist.strings */,
1F084A1616DCE6A200ED2517 /* ObjSTNative-Prefix.pch */,
Expand Down Expand Up @@ -1767,6 +1771,7 @@
buildActionMask = 2147483647;
files = (
1F084A1516DCE6A200ED2517 /* InfoPlist.strings in Resources */,
1FC2EEF3186B670F00B3D06F /* empty-class.llvm-templateasm in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down Expand Up @@ -1893,6 +1898,7 @@
files = (
1F084A1916DCE6A200ED2517 /* ObjSTNative.m in Sources */,
1F084A2116DCE6E600ED2517 /* MPWCodeGenerator.mm in Sources */,
1FC2EEF2186B653000B3D06F /* empty-class.llvm-templateasm in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down

0 comments on commit d80177f

Please sign in to comment.