src/libandroid/looper.c: fix for aarch64 (TODO: just implement these as extern C straight in libutils?)

This commit is contained in:
Mis012
2022-11-24 18:42:18 +01:00
parent d8315cd3a3
commit 12fffb0724

View File

@@ -4,22 +4,50 @@
typedef void ALooper; typedef void ALooper;
typedef int (*Looper_callbackFunc)(int fd, int events, void* data); typedef int (*Looper_callbackFunc)(int fd, int events, void* data);
void _ZN7android6Looper12getForThreadEv(void **ret); // no clue why itanium ABI does this with return values /* macros for creating wrappers for methods which use C++ itanium ABI */
ALooper * ALooper_forThread()
{ #ifdef __aarch64__
void *ret;
_ZN7android6Looper12getForThreadEv(&ret); #define ITANIUM_OBJ_RET_WRAPPER_DEC(ret_type, wrapper_name, mangled_name, ...) \
return ret; void mangled_name(__VA_ARGS__); /* r8 used instead of implicit parameter, fun innit */\
ret_type * wrapper_name(__VA_ARGS__)
#define ITANIUM_OBJ_RET_WRAPPER_BODY(ret_type, wrapper_name, mangled_name, ...) \
{ \
ret_type *ret; \
register ret_type **addr_of_ret asm("r8"); /* arm wants to be special :( */\
__asm__ ("" : : "" (addr_of_ret)); /* apparently __attribute__((used)) is not a thing */\
addr_of_ret = &ret; \
mangled_name(__VA_ARGS__); \
return ret; \
} }
void _ZN7android6Looper7prepareEi(void **ret, int opts); // no clue why itanium ABI does this with return values #else
ALooper * ALooper_prepare(int opts)
{ #define ITANIUM_OBJ_RET_WRAPPER_DEC(ret_type, wrapper_name, mangled_name, ...) \
void *ret; void mangled_name(ret_type **ret, ##__VA_ARGS__); /* implicit first parameter used for return value */\
_ZN7android6Looper7prepareEi(&ret, opts); ret_type * wrapper_name(__VA_ARGS__)
return ret;
#define ITANIUM_OBJ_RET_WRAPPER_BODY(ret_type, wrapper_name, mangled_name, ...) \
{ \
ret_type *ret; \
mangled_name(&ret, ##__VA_ARGS__); \
return ret; \
} }
#endif
#define ITANIUM_OBJ_RET_WRAPPER_NOARGS(ret_type, wrapper_name, mangled_name) \
ITANIUM_OBJ_RET_WRAPPER_DEC(ret_type, wrapper_name, mangled_name) \
ITANIUM_OBJ_RET_WRAPPER_BODY(ret_type, wrapper_name, mangled_name)
// ALooper * ALooper_forThread()
ITANIUM_OBJ_RET_WRAPPER_NOARGS(ALooper, ALooper_forThread, _ZN7android6Looper12getForThreadEv)
// ALooper * ALooper_prepare(int opts)
ITANIUM_OBJ_RET_WRAPPER_DEC(ALooper, ALooper_prepare, _ZN7android6Looper7prepareEi, int opts)
ITANIUM_OBJ_RET_WRAPPER_BODY(ALooper, ALooper_prepare, _ZN7android6Looper7prepareEi, opts)
int _ZN7android6Looper7pollAllEiPiS1_PPv(void *this, int timeoutMillis, int* outFd, int* outEvents, void** outData); int _ZN7android6Looper7pollAllEiPiS1_PPv(void *this, int timeoutMillis, int* outFd, int* outEvents, void** outData);
int ALooper_pollAll(int timeoutMillis, int* outFd, int* outEvents, void** outData) int ALooper_pollAll(int timeoutMillis, int* outFd, int* outEvents, void** outData)
{ {