let compiler handle abi
This commit is contained in:
parent
d25363ede5
commit
114b450534
|
|
@ -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";
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue