summaryrefslogtreecommitdiff
path: root/sysdeps/unix/sysv/linux/ia64/sysdep.h
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix/sysv/linux/ia64/sysdep.h')
-rw-r--r--sysdeps/unix/sysv/linux/ia64/sysdep.h24
1 files changed, 17 insertions, 7 deletions
diff --git a/sysdeps/unix/sysv/linux/ia64/sysdep.h b/sysdeps/unix/sysv/linux/ia64/sysdep.h
index bb4ab29eba..5f7f3fe3eb 100644
--- a/sysdeps/unix/sysv/linux/ia64/sysdep.h
+++ b/sysdeps/unix/sysv/linux/ia64/sysdep.h
@@ -34,6 +34,23 @@
#ifdef __ASSEMBLER__
+#undef CALL_MCOUNT
+#ifdef PROF
+# define CALL_MCOUNT \
+ .data; \
+1: data8 0; \
+ .previous; \
+ alloc out0 = ar.pfs, 8, 0, 4, 0; \
+ mov out1 = gp; \
+ mov out2 = rp; \
+ ;; \
+ addl out3 = @ltoff(1b), gp; \
+ br.call.sptk.many rp = _mcount \
+ ;;
+#else
+# define CALL_MCOUNT /* Do nothing. */
+#endif
+
/* Linux uses a negative return value to indicate syscall errors, unlike
most Unices, which use the condition codes' carry flag.
@@ -48,13 +65,6 @@
table when we define it here. */
#define SYSCALL_ERROR_LABEL __syscall_error
-#ifdef PROF
-#error "define CALL_MCOUNT"
-#else
-#define CALL_MCOUNT
-#endif
-
-
#undef PSEUDO
#define PSEUDO(name, syscall_name, args) \
ENTRY(name) \