aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/hipe/hipe_bif2.c
diff options
context:
space:
mode:
authorErlang/OTP <[email protected]>2009-11-20 14:54:40 +0000
committerErlang/OTP <[email protected]>2009-11-20 14:54:40 +0000
commit84adefa331c4159d432d22840663c38f155cd4c1 (patch)
treebff9a9c66adda4df2106dfd0e5c053ab182a12bd /erts/emulator/hipe/hipe_bif2.c
downloadotp-84adefa331c4159d432d22840663c38f155cd4c1.tar.gz
otp-84adefa331c4159d432d22840663c38f155cd4c1.tar.bz2
otp-84adefa331c4159d432d22840663c38f155cd4c1.zip
The R13B03 release.OTP_R13B03
Diffstat (limited to 'erts/emulator/hipe/hipe_bif2.c')
-rw-r--r--erts/emulator/hipe/hipe_bif2.c170
1 files changed, 170 insertions, 0 deletions
diff --git a/erts/emulator/hipe/hipe_bif2.c b/erts/emulator/hipe/hipe_bif2.c
new file mode 100644
index 0000000000..f992b758be
--- /dev/null
+++ b/erts/emulator/hipe/hipe_bif2.c
@@ -0,0 +1,170 @@
+/*
+ * %CopyrightBegin%
+ *
+ * Copyright Ericsson AB 2001-2009. All Rights Reserved.
+ *
+ * The contents of this file are subject to the Erlang Public License,
+ * Version 1.1, (the "License"); you may not use this file except in
+ * compliance with the License. You should have received a copy of the
+ * Erlang Public License along with this software. If not, it can be
+ * retrieved online at http://www.erlang.org/.
+ *
+ * Software distributed under the License is distributed on an "AS IS"
+ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ * the License for the specific language governing rights and limitations
+ * under the License.
+ *
+ * %CopyrightEnd%
+ */
+/* $Id$
+ * hipe_bif2.c
+ *
+ * Miscellaneous add-ons.
+ */
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include "sys.h"
+#include "error.h"
+#include "erl_vm.h"
+#include "global.h"
+#include "erl_process.h"
+#include "bif.h"
+#include "big.h"
+#include "hipe_debug.h"
+#include "hipe_mode_switch.h"
+#include "hipe_bif0.h" /* hipe_constants_{start,next} */
+#include "hipe_arch.h"
+#include "hipe_stack.h"
+
+BIF_RETTYPE hipe_bifs_show_estack_1(BIF_ALIST_1)
+{
+ Process *rp = erts_pid2proc(BIF_P, ERTS_PROC_LOCK_MAIN,
+ BIF_ARG_1, ERTS_PROC_LOCKS_ALL);
+ if (!rp)
+ BIF_ERROR(BIF_P, BADARG);
+ hipe_print_estack(rp);
+ erts_smp_proc_unlock(rp, ERTS_PROC_LOCKS_ALL);
+ BIF_RET(am_true);
+}
+
+BIF_RETTYPE hipe_bifs_show_heap_1(BIF_ALIST_1)
+{
+ Process *rp = erts_pid2proc(BIF_P, ERTS_PROC_LOCK_MAIN,
+ BIF_ARG_1, ERTS_PROC_LOCKS_ALL);
+ if (!rp)
+ BIF_ERROR(BIF_P, BADARG);
+ hipe_print_heap(rp);
+ erts_smp_proc_unlock(rp, ERTS_PROC_LOCKS_ALL);
+ BIF_RET(am_true);
+}
+
+BIF_RETTYPE hipe_bifs_show_nstack_1(BIF_ALIST_1)
+{
+ Process *rp = erts_pid2proc(BIF_P, ERTS_PROC_LOCK_MAIN,
+ BIF_ARG_1, ERTS_PROC_LOCKS_ALL);
+ if (!rp)
+ BIF_ERROR(BIF_P, BADARG);
+ hipe_print_nstack(rp);
+ erts_smp_proc_unlock(rp, ERTS_PROC_LOCKS_ALL);
+ BIF_RET(am_true);
+}
+
+BIF_RETTYPE hipe_bifs_nstack_used_size_0(BIF_ALIST_0)
+{
+ BIF_RET(make_small(hipe_nstack_used(BIF_P)));
+}
+
+BIF_RETTYPE hipe_bifs_show_pcb_1(BIF_ALIST_1)
+{
+ Process *rp = erts_pid2proc(BIF_P, ERTS_PROC_LOCK_MAIN,
+ BIF_ARG_1, ERTS_PROC_LOCKS_ALL);
+ if (!rp)
+ BIF_ERROR(BIF_P, BADARG);
+ hipe_print_pcb(rp);
+ erts_smp_proc_unlock(rp, ERTS_PROC_LOCKS_ALL);
+ BIF_RET(am_true);
+}
+
+BIF_RETTYPE hipe_bifs_show_term_1(BIF_ALIST_1)
+{
+ Eterm obj = BIF_ARG_1;
+
+ printf("0x%0*lx\r\n", 2*(int)sizeof(long), obj);
+ do {
+ Eterm *objp;
+ int i, ary;
+
+ if (is_list(obj)) {
+ objp = list_val(obj);
+ ary = 2;
+ } else if (is_boxed(obj)) {
+ Eterm header;
+
+ objp = boxed_val(obj);
+ header = objp[0];
+ if (is_thing(header))
+ ary = thing_arityval(header);
+ else if (is_arity_value(header))
+ ary = arityval(header);
+ else {
+ printf("bad header %#lx\r\n", header);
+ break;
+ }
+ ary += 1;
+ } else
+ break;
+ for (i = 0; i < ary; ++i)
+ printf("0x%0*lx: 0x%0*lx\r\n",
+ 2*(int)sizeof(long), (unsigned long)&objp[i],
+ 2*(int)sizeof(long), objp[i]);
+ } while (0);
+ erts_printf("%T", obj);
+ printf("\r\n");
+ BIF_RET(am_true);
+}
+
+BIF_RETTYPE hipe_bifs_show_literals_0(BIF_ALIST_0)
+{
+ Eterm *p;
+
+ p = hipe_constants_start;
+ for (; p < hipe_constants_next; ++p)
+ printf("0x%0*lx: 0x%0*lx\r\n",
+ 2*(int)sizeof(long), (unsigned long)p,
+ 2*(int)sizeof(long), *p);
+ BIF_RET(am_true);
+}
+
+BIF_RETTYPE hipe_bifs_in_native_0(BIF_ALIST_0)
+{
+ BIF_RET(am_false);
+}
+
+BIF_RETTYPE hipe_bifs_modeswitch_debug_on_0(BIF_ALIST_0)
+{
+ hipe_modeswitch_debug = 1;
+ BIF_RET(am_true);
+}
+
+BIF_RETTYPE hipe_bifs_modeswitch_debug_off_0(BIF_ALIST_0)
+{
+ hipe_modeswitch_debug = 0;
+ BIF_RET(am_true);
+}
+
+/* BIFs for handling the message area */
+
+BIF_RETTYPE hipe_bifs_show_message_area_0(BIF_ALIST_0)
+{
+#ifdef HYBRID
+#ifdef DEBUG
+ print_message_area();
+#else
+ printf("Only available in debug compiled emulator\r\n");
+#endif
+ BIF_RET(am_true);
+#else
+ BIF_RET(am_false);
+#endif
+}