X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fsgen-descriptor.h;h=f07ad4a6ba00b214189b2b51e470daea9ad21ac7;hb=57ade9dfca648f4970d4c48ebd96d1a02be9e975;hp=cd53a862c3d42e7db2249e3fb96ba2c0702e8f90;hpb=4df4b7a47a07d924d7bfcfc53f43bd2319b54266;p=mono.git diff --git a/mono/metadata/sgen-descriptor.h b/mono/metadata/sgen-descriptor.h index cd53a862c3d..f07ad4a6ba0 100644 --- a/mono/metadata/sgen-descriptor.h +++ b/mono/metadata/sgen-descriptor.h @@ -137,6 +137,7 @@ sgen_gc_descr_has_references (mword desc) #define SGEN_VTABLE_HAS_REFERENCES(vt) (sgen_gc_descr_has_references ((mword)((MonoVTable*)(vt))->gc_descr)) #define SGEN_CLASS_HAS_REFERENCES(c) (sgen_gc_descr_has_references ((mword)(c)->gc_descr)) +#define SGEN_OBJECT_HAS_REFERENCES(o) (SGEN_VTABLE_HAS_REFERENCES (SGEN_LOAD_VTABLE ((o)))) /* helper macros to scan and traverse objects, macros because we resue them in many functions */ #define OBJ_RUN_LEN_SIZE(size,desc,obj) do { \ @@ -153,6 +154,12 @@ sgen_gc_descr_has_references (mword desc) #define PREFETCH(addr) #endif +#if defined(__GNUC__) && SIZEOF_VOID_P==4 +#define GNUC_BUILTIN_CTZ(bmap) __builtin_ctz(bmap) +#elif defined(__GNUC__) && SIZEOF_VOID_P==8 +#define GNUC_BUILTIN_CTZ(bmap) __builtin_ctzl(bmap) +#endif + /* code using these macros must define a HANDLE_PTR(ptr) macro that does the work */ #define OBJ_RUN_LEN_FOREACH_PTR(desc,obj) do { \ if ((desc) & 0xffff0000) { \ @@ -170,21 +177,21 @@ sgen_gc_descr_has_references (mword desc) } \ } while (0) -#ifdef __GNUC__ +#if defined(__GNUC__) #define OBJ_BITMAP_FOREACH_PTR(desc,obj) do { \ /* there are pointers */ \ void **_objptr = (void**)(obj); \ gsize _bmap = (desc) >> 16; \ _objptr += OBJECT_HEADER_WORDS; \ { \ - int _index = __builtin_ctz (_bmap); \ + int _index = GNUC_BUILTIN_CTZ (_bmap); \ _objptr += _index; \ _bmap >>= (_index + 1); \ HANDLE_PTR (_objptr, (obj)); \ _objptr ++; \ } \ while (_bmap) { \ - int _index = __builtin_ctz (_bmap); \ + int _index = GNUC_BUILTIN_CTZ (_bmap); \ _objptr += _index; \ _bmap >>= (_index + 1); \ HANDLE_PTR (_objptr, (obj)); \