diff --git a/src/lj_alloc.c b/src/lj_alloc.c index 2d41481d..5de60b82 100644 --- a/src/lj_alloc.c +++ b/src/lj_alloc.c @@ -597,7 +597,7 @@ static int has_segment_link(mstate m, msegmentptr ss) noncontiguous segments are added. */ #define TOP_FOOT_SIZE\ - (align_offset(chunk2mem(0))+pad_request(sizeof(struct malloc_segment))+MIN_CHUNK_SIZE) + (align_offset(TWO_SIZE_T_SIZES)+pad_request(sizeof(struct malloc_segment))+MIN_CHUNK_SIZE) /* ---------------------------- Indexing Bins ---------------------------- */ diff --git a/src/lj_def.h b/src/lj_def.h index 5e63da3e..cfe18c48 100644 --- a/src/lj_def.h +++ b/src/lj_def.h @@ -120,7 +120,7 @@ typedef uintptr_t BloomFilter; #define bloomset(b, x) ((b) |= bloombit((x))) #define bloomtest(b, x) ((b) & bloombit((x))) -#if defined(__GNUC__) || defined(__psp2__) +#if defined(__GNUC__) || defined(__clang__) || defined(__psp2__) #define LJ_NORET __attribute__((noreturn)) #define LJ_ALIGN(n) __attribute__((aligned(n))) @@ -182,7 +182,7 @@ static LJ_AINLINE uint64_t lj_bswap64(uint64_t x) { return ((uint64_t)lj_bswap((uint32_t)x)<<32) | lj_bswap((uint32_t)(x>>32)); } -#elif (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) +#elif (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) || __clang__ static LJ_AINLINE uint32_t lj_bswap(uint32_t x) { return (uint32_t)__builtin_bswap32((int32_t)x); diff --git a/src/lj_emit_x86.h b/src/lj_emit_x86.h index 66750a96..9173a299 100644 --- a/src/lj_emit_x86.h +++ b/src/lj_emit_x86.h @@ -45,7 +45,7 @@ static LJ_AINLINE MCode *emit_op(x86Op xo, Reg rr, Reg rb, Reg rx, *(uint32_t *)(p+delta-5) = (uint32_t)xo; return p+delta-5; } -#if defined(__GNUC__) +#if defined(__GNUC__) || defined(__clang__) if (__builtin_constant_p(xo) && n == -2) p[delta-2] = (MCode)(xo >> 24); else if (__builtin_constant_p(xo) && n == -3) diff --git a/src/lj_err.c b/src/lj_err.c index 41fbf5c7..39339b10 100644 --- a/src/lj_err.c +++ b/src/lj_err.c @@ -61,7 +61,7 @@ ** The POSIX/x64 interpreter only saves r12/r13 for INT (e.g. PS4). */ -#if defined(__GNUC__) && (LJ_TARGET_X64 || defined(LUAJIT_UNWIND_EXTERNAL)) && !LJ_NO_UNWIND +#if (defined(__GNUC__) || defined(__clang__)) && (LJ_TARGET_X64 || defined(LUAJIT_UNWIND_EXTERNAL)) && !LJ_NO_UNWIND #define LJ_UNWIND_EXT 1 #elif LJ_TARGET_WINDOWS #define LJ_UNWIND_EXT 1 @@ -184,7 +184,7 @@ static void *err_unwind(lua_State *L, void *stopcf, int errcode) /* -- External frame unwinding -------------------------------------------- */ -#if defined(__GNUC__) && !LJ_NO_UNWIND && !LJ_ABI_WIN +#if (defined(__GNUC__) || defined(__clang__)) && !LJ_NO_UNWIND && !LJ_ABI_WIN /* ** We have to use our own definitions instead of the mandatory (!) unwind.h, diff --git a/src/lj_ircall.h b/src/lj_ircall.h index 58cebc5d..a45dde34 100644 --- a/src/lj_ircall.h +++ b/src/lj_ircall.h @@ -334,7 +334,7 @@ extern double lj_vm_sfmax(double a, double b); #endif #if LJ_HASFFI && LJ_NEED_FP64 && !(LJ_TARGET_ARM && LJ_SOFTFP) -#ifdef __GNUC__ +#if defined(__GNUC__) || defined(__clang__) #define fp64_l2d __floatdidf #define fp64_ul2d __floatundidf #define fp64_l2f __floatdisf diff --git a/src/lj_mcode.c b/src/lj_mcode.c index b2d12118..a5153b25 100644 --- a/src/lj_mcode.c +++ b/src/lj_mcode.c @@ -45,7 +45,7 @@ void lj_mcode_sync(void *start, void *end) sys_icache_invalidate(start, (char *)end-(char *)start); #elif LJ_TARGET_PPC lj_vm_cachesync(start, end); -#elif defined(__GNUC__) +#elif defined(__GNUC__) || defined(__clang__) __clear_cache(start, end); #else #error "Missing builtin to flush instruction cache" diff --git a/src/lj_strfmt.h b/src/lj_strfmt.h index b4fbbb94..9fe46d67 100644 --- a/src/lj_strfmt.h +++ b/src/lj_strfmt.h @@ -118,7 +118,7 @@ LJ_FUNC GCstr * LJ_FASTCALL lj_strfmt_obj(lua_State *L, cTValue *o); LJ_FUNC const char *lj_strfmt_pushvf(lua_State *L, const char *fmt, va_list argp); LJ_FUNC const char *lj_strfmt_pushf(lua_State *L, const char *fmt, ...) -#ifdef __GNUC__ +#if defined(__GNUC__) || defined(__clang__) __attribute__ ((format (printf, 2, 3))) #endif ; diff --git a/src/lj_strscan.c b/src/lj_strscan.c index 0e37a4f6..11abd526 100644 --- a/src/lj_strscan.c +++ b/src/lj_strscan.c @@ -79,7 +79,7 @@ static void strscan_double(uint64_t x, TValue *o, int32_t ex2, int32_t neg) /* Avoid double rounding for denormals. */ if (LJ_UNLIKELY(ex2 <= -1075 && x != 0)) { /* NYI: all of this generates way too much code on 32 bit CPUs. */ -#if defined(__GNUC__) && LJ_64 +#if (defined(__GNUC__) || defined(__clang__)) && LJ_64 int32_t b = (int32_t)(__builtin_clzll(x)^63); #else int32_t b = (x>>32) ? 32+(int32_t)lj_fls((uint32_t)(x>>32)) :