diff options
author | Erlang/OTP <[email protected]> | 2009-11-20 14:54:40 +0000 |
---|---|---|
committer | Erlang/OTP <[email protected]> | 2009-11-20 14:54:40 +0000 |
commit | 84adefa331c4159d432d22840663c38f155cd4c1 (patch) | |
tree | bff9a9c66adda4df2106dfd0e5c053ab182a12bd /erts/emulator/hipe/hipe_bif2.c | |
download | otp-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.c | 170 |
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 +} |