#ifndef TOOLS_CLANG_STACK_MAPS_OBJECTS_H_
#define TOOLS_CLANG_STACK_MAPS_OBJECTS_H_
#include <stdint.h>
#define GC_AS __attribute__((address_space(1)))
#define NO_STATEPOINT \
__attribute__((noinline)) __attribute__((annotate("no-statepoint")))
using Address = void GC_AS*;
class HeapObject {
public:
NO_STATEPOINT HeapObject(long data) : data(data) {}
long data;
};
template <typename T>
class Handle {
public:
static NO_STATEPOINT Handle<T> New(T* obj_ptr) {
auto gcptr = (Address GC_AS*)obj_ptr;
return Handle<T>(gcptr);
}
T operator*() const {
long data = *(long GC_AS*)address;
return HeapObject(data);
}
private:
Address address;
Handle<T>(Address address) : address(address) {}
};
#endif