2012-04-29 22 views
12

Ben OSX Kakao sınıflarını kullanan bazı Obj-C kodu derlemek için clang kullanarak OSX üzerinde çalışan, ve ben birlikte sonucu yönetmeye çalışıyorum kullanarak Objective-C yöntemleri çağırmak LLVM JIT derleyicisi. LLVM/Clang'ın en son kanama sürümünü kullanıyorum.Tüm seçiciler LLVM ExecutionEngine

hiçbir problem derleme veya kodumu bağlama vardır ve mutlulukla C ve C++ sistem herhangi bir sorun olmadan aramaları yapabilirsiniz. Ama tüm Obj-C operasyonları sefil bir şekilde başarısız oluyor ve ben neden çalışmam için derinlikten çıkıyorum! objc_msgSend() işlevi doğru çağrılıyor gibi görünüyor, ancak çalışma zamanı en basit seçicileri bile tanımayı reddediyor.

Sadece clang, lli kullanarak sorunu yeniden başardılar, ve bunu yapmak için nasıl:

basit bir dosya test.mm oluşturun: o ..compile

#include <Cocoa/Cocoa.h> 
#include <cstdio> 
#include <iostream> 

extern "C" int main (int, char**) 
{ 
    std::cout << "==== step 1" << std::endl; 

    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; 
    [pool release]; 

    std::cout << "==== step 2" << std::endl; 

    return 0; 
} 

için clang bitcode:

clang -emit-llvm test.mm -c -o test.bc 

Sonra LLI ile çalıştırın:

lli -load=/System/Library/Frameworks/Foundation.framework/Versions/Current/Foundation test.bc 
LLI ait

çıktı şuna benzer: Eğer günlüğüne görebileceğiniz gibi

==== step 1 
objc[45353]: Object 0x101a362a0 of class __NSCFString autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug 
2012-04-29 20:07:35.384 lli[45353:707] -[NSAutoreleasePool init]: unrecognized selector sent to instance 0x101a35170 
2012-04-29 20:07:35.386 lli[45353:707] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSAutoreleasePool init]: unrecognized selector sent to instance 0x101a35170' 
*** First throw call stack: 
(
    0 CoreFoundation      0x00007fff89c76fc6 __exceptionPreprocess + 198 
    1 libobjc.A.dylib      0x00007fff8c9e6d5e objc_exception_throw + 43 
    2 CoreFoundation      0x00007fff89d032ae -[NSObject doesNotRecognizeSelector:] + 190 
    3 CoreFoundation      0x00007fff89c63e73 ___forwarding___ + 371 
    4 CoreFoundation      0x00007fff89c63c88 _CF_forwarding_prep_0 + 232 
    5 ???         0x0000000101929111 0x0 + 4321349905 
    6 lli         0x000000010148f36b _ZN4llvm15ExecutionEngine17runFunctionAsMainEPNS_8FunctionERKSt6vectorISsSaISsEEPKPKc + 1259 
    7 lli         0x0000000101016657 main + 3095 
    8 lli         0x0000000101015a34 start + 52 
    9 ???         0x0000000000000003 0x0 + 3 
) 
terminate called throwing an exception0 lli    0x00000001015c5b02 _ZL15PrintStackTracePv + 34 
1 lli    0x00000001015c5fd9 _ZL13SignalHandleri + 633 
2 libsystem_c.dylib 0x00007fff8f8bccfa _sigtramp + 26 
3 libsystem_c.dylib 0x0000000000000001 _sigtramp + 18446603338107859745 
4 libsystem_c.dylib 0x00007fff8f85ba7a abort + 143 
5 libc++abi.dylib 0x00007fff8518a7bc abort_message + 214 
6 libc++abi.dylib 0x00007fff85187fcf default_terminate() + 28 
7 libobjc.A.dylib 0x00007fff8c9e71b9 _objc_terminate + 94 
8 libc++abi.dylib 0x00007fff85188001 safe_handler_caller(void (*)()) + 11 
9 libc++abi.dylib 0x00007fff8518805c __cxa_bad_typeid + 0 
10 libc++abi.dylib 0x00007fff85189152 __gxx_exception_cleanup(_Unwind_Reason_Code, _Unwind_Exception*) + 0 
11 libobjc.A.dylib 0x00007fff8c9e6e7a _objc_exception_destructor + 0 
12 CoreFoundation 0x00007fff89d032ae -[NSObject doesNotRecognizeSelector:] + 190 
13 CoreFoundation 0x00007fff89c63e73 ___forwarding___ + 371 
14 CoreFoundation 0x00007fff89c63c88 _CF_forwarding_prep_0 + 232 
15 CoreFoundation 0x0000000101929111 _CF_forwarding_prep_0 + 18446603342526043505 
16 lli    0x000000010148f36b llvm::ExecutionEngine::runFunctionAsMain(llvm::Function*, std::vector<std::string, std::allocator<std::string> > const&, char const* const*) + 1259 
17 lli    0x0000000101016657 main + 3095 
18 lli    0x0000000101015a34 start + 52 
19 lli    0x0000000000000003 start + 18446744069397718531 
Stack dump: 
0. Program arguments: Release/bin/lli -load=/System/Library/Frameworks/Foundation.framework/Versions/Current/Foundation /Users/jules/Desktop/test.bc 
Abort trap: 6 

, bu -[NSAutoreleasePool init] tanınmayan seçici olduğunu söylüyor. Aynı şey, başka herhangi bir seçici için de geçerlidir. -[NSString init] veya açıkça çalışması gereken diğer şeyler.

Herhangi bir yardım veya ipuçları çok takdir! Bunun bir hata mı, yanlış yaptığım bir şey mi, yoksa henüz bitmemiş bir özellik mi olduğu konusunda biraz kaydım. Bu sorunun LLVM dokümanlarındaki veya aralarında herhangi bir yerde herhangi bir referans bulamıyorum.

Böyle mirası Obj-C kırılgan ABI gibi farklı çınlama seçenekleri denedik, ama hiçbir şans oldu. LLVM ya da Obj-C çalışma zamanı konusunda uzman değilim ve bu beni güldürdü.

--EDIT--

Sadece biraz o biriyle bir zili umuduyla daha fazla bilgi, ..

Ben açık bir normal obj-C mesajı çağırmayı yerine çalıştı o tınlamak zaman SEL değerini otomatik olarak oluşturur görünüyor ..Bu yüzden o zamanı tarafından kullanılabilir olmayan bir değer üretiyor,

SEL s = sel_getUid ("init"); 
objc_msgSend (myObject, s); // Succeeds! 

SEL s = @selector (init); 
objc_msgSend (myObject, s); // Fails! 

: objc_msgSend çağrısı, bunu buldum. LLVM/Clang kod tabanında nerede olup bitenleri anlamaya çalışmam gerektiğini kim bile söyleyebilir?

+0

Bu tarihten bu yana ilerleme kaydettiniz mi? –

+0

İlgilenen herkes için LLVM dev hakkında bir tartışma var: [LLVM JIT üzerinden Objective-C kodu yürütmek mümkün mü?] (Http://lists.llvm.org/pipermail/llvm-dev/2016-November/ 106995.html). –

cevap

2

Objective-C seçicileri başvurmak için özel olarak adlandırılmış globalsi kullanır ve bağlayıcı ve objc çalışma zamanı normalde her şey iş yapar bu globalsin özel bilgilere sahip. lli'nin Objective-C hakkında bilgisi yoktur; Bu nedenle, ObjC çalışma zamanı, söz konusu globals için özel işlemlerini asla gerçekleştirmez. Başımın Kapalı

, ben tam olarak olsa, çalışması için yapmanız gereken hiçbir fikrim yok.

+0

Evet, bunun gibi bir şey olduğundan şüpheleniyorum. Hata ayıklama günlüğü seçicinin ismini doğru olarak gösterir, bu nedenle yapının bir ölçüde başlatılması gerekir, ancak belki de doğru şekilde ayarlanmamış bir tür sınıf yapısı vardır. – jules72