.file = __FILE__, .line = __LINE__, \
.type = MEM_STATS_TYPE_CALLOC, \
}; \
- __asm__(".weak __start_mem_stats"); \
- __asm__(".weak __stop_mem_stats"); \
+ HA_GLOBL("__start_mem_stats"); \
+ HA_GLOBL("__stop_mem_stats"); \
_HA_ATOMIC_INC(&_.calls); \
_HA_ATOMIC_ADD(&_.size, __x * __y); \
calloc(__x,__y); \
.file = __FILE__, .line = __LINE__, \
.type = MEM_STATS_TYPE_FREE, \
}; \
- __asm__(".weak __start_mem_stats"); \
- __asm__(".weak __stop_mem_stats"); \
+ HA_GLOBL("__start_mem_stats"); \
+ HA_GLOBL("__stop_mem_stats"); \
if (__x) \
_HA_ATOMIC_INC(&_.calls); \
free(__x); \
.file = __FILE__, .line = __LINE__, \
.type = MEM_STATS_TYPE_FREE, \
}; \
- __asm__(".weak __start_mem_stats"); \
- __asm__(".weak __stop_mem_stats"); \
+ HA_GLOBL("__start_mem_stats"); \
+ HA_GLOBL("__stop_mem_stats"); \
if (__builtin_constant_p((x)) || __builtin_constant_p(*(x))) { \
HA_LINK_ERROR(call_to_ha_free_attempts_to_free_a_constant); \
} \
.file = __FILE__, .line = __LINE__, \
.type = MEM_STATS_TYPE_MALLOC, \
}; \
- __asm__(".weak __start_mem_stats"); \
- __asm__(".weak __stop_mem_stats"); \
+ HA_GLOBL("__start_mem_stats"); \
+ HA_GLOBL("__stop_mem_stats"); \
_HA_ATOMIC_INC(&_.calls); \
_HA_ATOMIC_ADD(&_.size, __x); \
malloc(__x); \
.file = __FILE__, .line = __LINE__, \
.type = MEM_STATS_TYPE_REALLOC, \
}; \
- __asm__(".weak __start_mem_stats"); \
- __asm__(".weak __stop_mem_stats"); \
+ HA_GLOBL("__start_mem_stats"); \
+ HA_GLOBL("__stop_mem_stats"); \
_HA_ATOMIC_INC(&_.calls); \
_HA_ATOMIC_ADD(&_.size, __y); \
realloc(__x,__y); \
.file = __FILE__, .line = __LINE__, \
.type = MEM_STATS_TYPE_STRDUP, \
}; \
- __asm__(".weak __start_mem_stats"); \
- __asm__(".weak __stop_mem_stats"); \
+ HA_GLOBL("__start_mem_stats"); \
+ HA_GLOBL("__stop_mem_stats"); \
_HA_ATOMIC_INC(&_.calls); \
_HA_ATOMIC_ADD(&_.size, __y); \
strdup(__x); \
#endif // USE_OBSOLETE_LINKER
+/* Declare a symbol as global and if possible, as weak. Since we don't want to
+ * error on multiple definitions, the symbol is declared weak. On MacOS ".weak"
+ * does not exist and we must continue to use ".globl" instead. Note that
+ * ".global" is to be avoided on other platforms as llvm complains about it
+ * being used for symbols declared as weak elsewhere in the code. It may or may
+ * not work depending on linkers and assemblers, this is only for advanced use
+ * anyway (and most likely it will only work with !USE_OBSOLETE_LINKER).
+ */
+#if defined(__APPLE__)
+# define __HA_GLOBL(sym) __asm__(".globl " #sym)
+#else
+# define __HA_GLOBL(sym) __asm__(".weak " #sym)
+#endif
+#define HA_GLOBL(sym) __HA_GLOBL(sym)
+
/* use this attribute on a variable to move it to the read_mostly section */
#if !defined(__read_mostly)
#define __read_mostly HA_SECTION("read_mostly")
* as a pointer (args are cast to (void*)). Do not use this macro directly,
* use INITCALL{0..3}() instead.
*/
-#define __HA_GLOBL1(sym) __asm__(".weak " #sym)
-#define __HA_GLOBL(sym) __HA_GLOBL1(sym)
#define __DECLARE_INITCALL(stg, linenum, function, a1, a2, a3) \
- __HA_GLOBL(__start_i_##stg ); \
- __HA_GLOBL(__stop_i_##stg ); \
+ HA_GLOBL(__start_i_##stg ); \
+ HA_GLOBL(__stop_i_##stg ); \
static const struct initcall *__initcb_##linenum \
__attribute__((__used__)) HA_INIT_SECTION(stg) = \
(stg < STG_SIZE) ? &(const struct initcall) { \