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?
Bu tarihten bu yana ilerleme kaydettiniz mi? –
İ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). –