let compiler handle abi
This commit is contained in:
parent
d25363ede5
commit
114b450534
|
|
@ -18,7 +18,7 @@ namespace art {
|
||||||
if (UNLIKELY(thiz == nullptr))
|
if (UNLIKELY(thiz == nullptr))
|
||||||
return "null";
|
return "null";
|
||||||
if (LIKELY(PrettyMethodSym))
|
if (LIKELY(PrettyMethodSym))
|
||||||
return PrettyMethodSym(thiz, with_signature);
|
return edxp::call_as_member_func(PrettyMethodSym, thiz, with_signature);
|
||||||
else return "null sym";
|
else return "null sym";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ namespace art {
|
||||||
|
|
||||||
CREATE_FUNC_SYMBOL_ENTRY(void, SetEntryPointsToInterpreter, void *thiz, void *art_method) {
|
CREATE_FUNC_SYMBOL_ENTRY(void, SetEntryPointsToInterpreter, void *thiz, void *art_method) {
|
||||||
if (LIKELY(SetEntryPointsToInterpreterSym))
|
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) {
|
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,
|
CREATE_FUNC_SYMBOL_ENTRY(void, MakeInitializedClassesVisiblyInitialized, void *thiz,
|
||||||
void *self, bool wait) {
|
void *self, bool wait) {
|
||||||
if (LIKELY(MakeInitializedClassesVisiblyInitializedSym))
|
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,
|
CREATE_FUNC_SYMBOL_ENTRY(collector::GcType, WaitForGcToComplete,
|
||||||
void *thiz, GcCause cause, void *threadSelf) {
|
void *thiz, GcCause cause, void *threadSelf) {
|
||||||
if (LIKELY(WaitForGcToCompleteSym))
|
if (LIKELY(WaitForGcToCompleteSym))
|
||||||
return WaitForGcToCompleteSym(thiz, cause, threadSelf);
|
return edxp::call_as_member_func(WaitForGcToCompleteSym, thiz, cause, threadSelf);
|
||||||
return art::gc::collector::GcType::kGcTypeNone;
|
return art::gc::collector::GcType::kGcTypeNone;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,12 +9,12 @@ namespace art {
|
||||||
class JNIEnvExt : edxp::HookedObject {
|
class JNIEnvExt : edxp::HookedObject {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
CREATE_FUNC_SYMBOL_ENTRY(jobject, NewLocalRef, void *env, void *mirror_ptr) {
|
CREATE_FUNC_SYMBOL_ENTRY(jobject, NewLocalRef, void *thiz, void *mirror_ptr) {
|
||||||
return NewLocalRefSym(env, mirror_ptr);
|
return edxp::call_as_member_func(NewLocalRefSym, thiz, mirror_ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
CREATE_FUNC_SYMBOL_ENTRY(void, DeleteLocalRef, void *env, jobject obj) {
|
CREATE_FUNC_SYMBOL_ENTRY(void, DeleteLocalRef, void *thiz, jobject obj) {
|
||||||
DeleteLocalRefSym(env, obj);
|
return edxp::call_as_member_func(DeleteLocalRefSym, thiz, obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ namespace art {
|
||||||
CREATE_FUNC_SYMBOL_ENTRY(const char *, GetDescriptor, void *thiz,
|
CREATE_FUNC_SYMBOL_ENTRY(const char *, GetDescriptor, void *thiz,
|
||||||
std::string *storage) {
|
std::string *storage) {
|
||||||
if (GetDescriptorSym)
|
if (GetDescriptorSym)
|
||||||
return GetDescriptorSym(thiz, storage);
|
return edxp::call_as_member_func(GetDescriptorSym, thiz, storage);
|
||||||
else
|
else
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
@ -45,7 +45,7 @@ namespace art {
|
||||||
|
|
||||||
CREATE_FUNC_SYMBOL_ENTRY(void*, GetClassDef, void* thiz) {
|
CREATE_FUNC_SYMBOL_ENTRY(void*, GetClassDef, void* thiz) {
|
||||||
if (LIKELY(GetClassDefSym))
|
if (LIKELY(GetClassDefSym))
|
||||||
return GetClassDefSym(thiz);
|
return edxp::call_as_member_func(GetClassDefSym, thiz);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@ namespace art {
|
||||||
|
|
||||||
CREATE_FUNC_SYMBOL_ENTRY(void, DeoptimizeBootImage, void *thiz) {
|
CREATE_FUNC_SYMBOL_ENTRY(void, DeoptimizeBootImage, void *thiz) {
|
||||||
if (LIKELY(DeoptimizeBootImageSym))
|
if (LIKELY(DeoptimizeBootImageSym))
|
||||||
DeoptimizeBootImageSym(thiz);
|
edxp::call_as_member_func(DeoptimizeBootImageSym, thiz);
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
|
||||||
|
|
@ -7,28 +7,12 @@ namespace art {
|
||||||
|
|
||||||
class Thread : public edxp::HookedObject {
|
class Thread : public edxp::HookedObject {
|
||||||
|
|
||||||
#ifdef __i386__
|
CREATE_FUNC_SYMBOL_ENTRY(edxp::ObjPtr, DecodeJObject, void *thiz, jobject obj) {
|
||||||
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) {
|
|
||||||
if (DecodeJObjectSym)
|
if (DecodeJObjectSym)
|
||||||
return DecodeJObjectSym(thiz, obj);
|
return edxp::call_as_member_func(DecodeJObjectSym, thiz, obj);
|
||||||
else
|
else
|
||||||
return nullptr;
|
return {.data=nullptr};
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
CREATE_FUNC_SYMBOL_ENTRY(void *, CurrentFromGdb) {
|
CREATE_FUNC_SYMBOL_ENTRY(void *, CurrentFromGdb) {
|
||||||
if (LIKELY(CurrentFromGdbSym))
|
if (LIKELY(CurrentFromGdbSym))
|
||||||
return CurrentFromGdbSym();
|
return CurrentFromGdbSym();
|
||||||
|
|
@ -51,7 +35,7 @@ namespace art {
|
||||||
|
|
||||||
void *DecodeJObject(jobject obj) {
|
void *DecodeJObject(jobject obj) {
|
||||||
if (LIKELY(thiz_ && DecodeJObjectSym)) {
|
if (LIKELY(thiz_ && DecodeJObjectSym)) {
|
||||||
return DecodeJObject(thiz_, obj);
|
return DecodeJObject(thiz_, obj).data;
|
||||||
}
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -82,6 +82,10 @@ namespace edxp {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct ObjPtr {
|
||||||
|
void* data;
|
||||||
|
};
|
||||||
|
|
||||||
ALWAYS_INLINE static void *Dlsym(void *handle, const char *name) {
|
ALWAYS_INLINE static void *Dlsym(void *handle, const char *name) {
|
||||||
return dlsym(handle, 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
|
} // namespace edxp
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue