let compiler handle abi

This commit is contained in:
LoveSy 2021-01-07 22:13:19 +08:00 committed by kotori0
parent d25363ede5
commit 114b450534
No known key found for this signature in database
GPG Key ID: 3FEE57ED0385A6B2
8 changed files with 70 additions and 31 deletions

View File

@ -18,7 +18,7 @@ namespace art {
if (UNLIKELY(thiz == nullptr))
return "null";
if (LIKELY(PrettyMethodSym))
return PrettyMethodSym(thiz, with_signature);
return edxp::call_as_member_func(PrettyMethodSym, thiz, with_signature);
else return "null sym";
}

View File

@ -22,7 +22,7 @@ namespace art {
CREATE_FUNC_SYMBOL_ENTRY(void, SetEntryPointsToInterpreter, void *thiz, void *art_method) {
if (LIKELY(SetEntryPointsToInterpreterSym))
SetEntryPointsToInterpreterSym(thiz, art_method);
edxp::call_as_member_func(SetEntryPointsToInterpreterSym, thiz, art_method);
}
CREATE_HOOK_STUB_ENTRIES(void *, Constructor, void *thiz, void *intern_table) {
@ -49,7 +49,7 @@ namespace art {
CREATE_FUNC_SYMBOL_ENTRY(void, MakeInitializedClassesVisiblyInitialized, void *thiz,
void *self, bool wait) {
if (LIKELY(MakeInitializedClassesVisiblyInitializedSym))
MakeInitializedClassesVisiblyInitializedSym(thiz, self, wait);
edxp::call_as_member_func(MakeInitializedClassesVisiblyInitializedSym, thiz, self, wait);
}

View File

@ -19,7 +19,7 @@ namespace art {
CREATE_FUNC_SYMBOL_ENTRY(collector::GcType, WaitForGcToComplete,
void *thiz, GcCause cause, void *threadSelf) {
if (LIKELY(WaitForGcToCompleteSym))
return WaitForGcToCompleteSym(thiz, cause, threadSelf);
return edxp::call_as_member_func(WaitForGcToCompleteSym, thiz, cause, threadSelf);
return art::gc::collector::GcType::kGcTypeNone;
}

View File

@ -9,12 +9,12 @@ namespace art {
class JNIEnvExt : edxp::HookedObject {
private:
CREATE_FUNC_SYMBOL_ENTRY(jobject, NewLocalRef, void *env, void *mirror_ptr) {
return NewLocalRefSym(env, mirror_ptr);
CREATE_FUNC_SYMBOL_ENTRY(jobject, NewLocalRef, void *thiz, void *mirror_ptr) {
return edxp::call_as_member_func(NewLocalRefSym, thiz, mirror_ptr);
}
CREATE_FUNC_SYMBOL_ENTRY(void, DeleteLocalRef, void *env, jobject obj) {
DeleteLocalRefSym(env, obj);
CREATE_FUNC_SYMBOL_ENTRY(void, DeleteLocalRef, void *thiz, jobject obj) {
return edxp::call_as_member_func(DeleteLocalRefSym, thiz, obj);
}
public:

View File

@ -17,7 +17,7 @@ namespace art {
CREATE_FUNC_SYMBOL_ENTRY(const char *, GetDescriptor, void *thiz,
std::string *storage) {
if (GetDescriptorSym)
return GetDescriptorSym(thiz, storage);
return edxp::call_as_member_func(GetDescriptorSym, thiz, storage);
else
return "";
}
@ -45,7 +45,7 @@ namespace art {
CREATE_FUNC_SYMBOL_ENTRY(void*, GetClassDef, void* thiz) {
if (LIKELY(GetClassDefSym))
return GetClassDefSym(thiz);
return edxp::call_as_member_func(GetClassDefSym, thiz);
return nullptr;
}

View File

@ -13,7 +13,7 @@ namespace art {
CREATE_FUNC_SYMBOL_ENTRY(void, DeoptimizeBootImage, void *thiz) {
if (LIKELY(DeoptimizeBootImageSym))
DeoptimizeBootImageSym(thiz);
edxp::call_as_member_func(DeoptimizeBootImageSym, thiz);
}
public:

View File

@ -7,28 +7,12 @@ namespace art {
class Thread : public edxp::HookedObject {
#ifdef __i386__
typedef void (*DecodeJObjectType)(void **, void *thiz, jobject obj);
inline static void (*DecodeJObjectSym)(void **, void *thiz, jobject obj);
static void *DecodeJObject(void *thiz, jobject obj) {
if (LIKELY(DecodeJObjectSym)) {
// Special call conversion
void *ret = nullptr;
DecodeJObjectSym(&ret, thiz, obj);
// Stack unbalanced since we faked return value as 1st param
__asm__("sub $0x4, %esp");
return ret;
} else
return nullptr;
}
#else
CREATE_FUNC_SYMBOL_ENTRY(void *, DecodeJObject, void *thiz, jobject obj) {
CREATE_FUNC_SYMBOL_ENTRY(edxp::ObjPtr, DecodeJObject, void *thiz, jobject obj) {
if (DecodeJObjectSym)
return DecodeJObjectSym(thiz, obj);
return edxp::call_as_member_func(DecodeJObjectSym, thiz, obj);
else
return nullptr;
return {.data=nullptr};
}
#endif
CREATE_FUNC_SYMBOL_ENTRY(void *, CurrentFromGdb) {
if (LIKELY(CurrentFromGdbSym))
return CurrentFromGdbSym();
@ -51,7 +35,7 @@ namespace art {
void *DecodeJObject(jobject obj) {
if (LIKELY(thiz_ && DecodeJObjectSym)) {
return DecodeJObject(thiz_, obj);
return DecodeJObject(thiz_, obj).data;
}
return nullptr;
}

View File

@ -82,6 +82,10 @@ namespace edxp {
}
};
struct ObjPtr {
void* data;
};
ALWAYS_INLINE static void *Dlsym(void *handle, const char *name) {
return dlsym(handle, name);
}
@ -125,4 +129,55 @@ namespace edxp {
}
}
template<typename Class, typename Return, typename T, typename... Args>
inline auto memfun_cast(Return (*func)(T *, Args...)) {
static_assert(std::is_same_v<T, void> || std::is_same_v<Class, T>,
"Not viable cast");
union {
Return (Class::*f)(Args...);
struct {
decltype(func) p;
std::ptrdiff_t adj;
} data;
} u{.data = {func, 0}};
static_assert(sizeof(u.f) == sizeof(u.data), "Try different T");
return u.f;
}
template<typename Return, typename... Args, typename T,
typename = std::enable_if_t<!std::is_same_v<T, void>>>
inline auto memfun_cast(Return (*func)(T *, Args...)) {
return memfun_cast<T>(func);
}
template<typename Return, typename... Args, typename T, typename U,
typename = std::enable_if_t<!std::is_same_v<T, void> || !std::is_same_v<U, void>>>
inline Return
call_as_member_func(Return (*func)(U *, std::remove_reference_t<Args>...), T *thiz,
Args &&... args) {
using Class = std::conditional_t<std::is_same_v<T, void>, U, T>;
return (reinterpret_cast<Class *>(thiz)->*memfun_cast<Class>
(func))(
std::forward<Args>(args)...);
}
template<typename Class, typename Return, typename... Args>
inline Return
call_as_member_func(Return (*func)(void *, std::remove_reference_t<Args>...), void *thiz,
Args &&... args) {
return (reinterpret_cast<Class *>(thiz)->*memfun_cast<Class>(func))(
std::forward<Args>(args)...);
}
template<typename Return, typename... Args>
inline Return
call_as_member_func(Return (*func)(void *, std::remove_reference_t<Args>...), void *thiz,
Args &&... args) {
struct DummyClass {
};
return (reinterpret_cast<DummyClass *>(thiz)->*memfun_cast<DummyClass>(func))(
std::forward<Args>(args)...);
}
} // namespace edxp