Skip to content

Commit 20f180a

Browse files
committed
add garbage collect support for arm64
1 parent 8772735 commit 20f180a

File tree

1 file changed

+17
-12
lines changed

1 file changed

+17
-12
lines changed

Source/Library/MemoryManager.cpp

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include <setjmp.h>
2+
#include <vector>
23

34
#include "DetectOs.hpp"
45
#include "MemoryManager.hpp"
@@ -9,7 +10,7 @@
910
#include <processthreadsapi.h>
1011
#endif
1112

12-
#ifdef LINUX
13+
#if defined(LINUX) || defined(APPLE)
1314
#include <pthread.h>
1415
#endif
1516

@@ -18,14 +19,19 @@ namespace sd
1819
namespace
1920
{
2021

21-
#define __READ_RBP(rbp) __asm__ volatile("movq %%rbp, %0" : "=r"(rbp))
22+
#define __READ_RBP(rbp) __asm__ volatile("movq %%rbp, %0" : "=r"(rbp)) // x86
23+
#define __READ_RBP_ARM(rbp) __asm__ volatile("mov %0, sp" : "=r"(rbp)) // arm64
2224
#define __READ_RSP(rsp) __asm__ volatile("movq %%rsp, %0" : "=r"(rsp))
2325

24-
auto getStackRsp()
26+
uint8_t *getStackRsp()
2527
{
26-
intptr_t *rsp;
27-
__READ_RSP(rsp);
28-
return (uint8_t *)rsp;
28+
intptr_t *ptr;
29+
#ifdef APPLE
30+
__READ_RBP_ARM(ptr);
31+
#else
32+
__READ_RSP(ptr);
33+
#endif
34+
return (uint8_t *)ptr;
2935
}
3036

3137
#ifdef WINDOWS
@@ -38,17 +44,16 @@ namespace sd
3844
return std::make_tuple((uint8_t *)highLimit - 10, (uint8_t *)lowLimit, rsp);
3945
}
4046
#endif
41-
#ifdef LINUX
47+
#if defined(LINUX) || defined(APPLE)
4248
auto getStackBounds()
4349
{
4450
auto rsp = getStackRsp();
4551
pthread_attr_t attrs;
46-
pthread_getattr_np(pthread_self(), &attrs);
47-
void *stack_ptr;
48-
size_t stack_size;
49-
pthread_attr_getstack(&attrs, &stack_ptr, &stack_size);
52+
auto self = pthread_self();
53+
void *stack_ptr = pthread_get_stackaddr_np(self);
54+
size_t stack_size = pthread_get_stacksize_np(self);
5055

51-
return std::make_tuple((uint8_t *)stack_ptr + stack_size - 10, (uint8_t *)stack_ptr, rsp);
56+
return std::make_tuple((uint8_t *)stack_ptr - 10, (uint8_t *)stack_ptr - stack_size, rsp);
5257
}
5358
#endif
5459
} // namespace

0 commit comments

Comments
 (0)