X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FDisassembler.c;h=0063a65e052af1a83e8685ff00270708417541d4;hb=114470474d2e037d16b736354070fa03181e8348;hp=72715a4bfe5c5ec84eff981e851c405be4bf569f;hpb=ba108537e489e74e088b210ee25c13ce09bcc572;p=ghc-hetmet.git diff --git a/ghc/rts/Disassembler.c b/ghc/rts/Disassembler.c index 72715a4..0063a65 100644 --- a/ghc/rts/Disassembler.c +++ b/ghc/rts/Disassembler.c @@ -5,12 +5,13 @@ * Copyright (c) 1994-1998. * * $RCSfile: Disassembler.c,v $ - * $Revision: 1.16 $ - * $Date: 2000/12/20 14:47:22 $ + * $Revision: 1.24 $ + * $Date: 2001/08/14 13:40:09 $ * ---------------------------------------------------------------------------*/ -#ifdef GHCI +#ifdef DEBUG +#include "PosixSource.h" #include "Rts.h" #include "RtsAPI.h" #include "RtsUtils.h" @@ -44,6 +45,17 @@ int disInstr ( StgBCO *bco, int pc ) StgInfoTable** itbls = (StgInfoTable**)(&itbls_arr->payload[0]); switch (instrs[pc++]) { + case bci_SWIZZLE: + fprintf(stderr, "SWIZZLE stkoff %d by %d\n", + instrs[pc], (signed int)instrs[pc+1]); + pc += 2; break; + case bci_CCALL: + fprintf(stderr, "CCALL marshaller at 0x%x\n", + literals[instrs[pc]] ); + pc += 1; break; + case bci_STKCHECK: + fprintf(stderr, "STKCHECK %d\n", instrs[pc] ); + pc += 1; break; case bci_ARGCHECK: fprintf(stderr, "ARGCHECK %d\n", instrs[pc] ); pc += 1; break; @@ -58,11 +70,13 @@ int disInstr ( StgBCO *bco, int pc ) instrs[pc+2] ); pc += 3; break; case bci_PUSH_G: - fprintf(stderr, "PUSH_G " ); printPtr( ptrs[instrs[pc]] ); + fprintf(stderr, "PUSH_G " ); printPtr( ptrs[instrs[pc]] ); + fprintf(stderr, "\n" ); pc += 1; break; case bci_PUSH_AS: fprintf(stderr, "PUSH_AS " ); printPtr( ptrs[instrs[pc]] ); fprintf(stderr, " 0x%x", literals[instrs[pc+1]] ); + fprintf(stderr, "\n"); pc += 2; break; case bci_PUSH_UBX: fprintf(stderr, "PUSH_UBX "); @@ -93,8 +107,16 @@ int disInstr ( StgBCO *bco, int pc ) case bci_PACK: fprintf(stderr, "PACK %d words with itbl ", instrs[pc+1] ); printPtr( (StgPtr)itbls[instrs[pc]] ); + fprintf(stderr, "\n"); pc += 2; break; + case bci_CASEFAIL: + fprintf(stderr, "CASEFAIL\n" ); + break; + case bci_JMP: + fprintf(stderr, "JMP to %d\n", instrs[pc]); + pc += 1; break; + case bci_TESTLT_I: fprintf(stderr, "TESTLT_I %d, fail to %d\n", literals[instrs[pc]], instrs[pc+1]); @@ -151,18 +173,40 @@ int disInstr ( StgBCO *bco, int pc ) */ void disassemble( StgBCO *bco ) { + nat i, j; StgArrWords* instr_arr = bco->instrs; UShort* instrs = (UShort*)(&instr_arr->payload[0]); - int nbcs = (int)instrs[0]; - int pc = 1; + StgMutArrPtrs* ptrs = bco->ptrs; + nat nbcs = (int)instrs[0]; + nat pc = 1; - fprintf(stderr, "\n\nBCO %p =\n", bco ); + fprintf(stderr, "BCO\n" ); pc = 1; while (pc <= nbcs) { fprintf(stderr, "\t%2d: ", pc ); pc = disInstr ( bco, pc ); } + + fprintf(stderr, "INSTRS:\n " ); + j = 16; + for (i = 0; i < nbcs; i++) { + fprintf(stderr, "%3d ", (int)instrs[i] ); + j--; + if (j == 0) { j = 16; fprintf(stderr, "\n "); }; + } + fprintf(stderr, "\n"); + + fprintf(stderr, "PTRS:\n " ); + j = 8; + for (i = 0; i < ptrs->ptrs; i++) { + fprintf(stderr, "%8p ", ptrs->payload[i] ); + j--; + if (j == 0) { j = 8; fprintf(stderr, "\n "); }; + } + fprintf(stderr, "\n"); + + fprintf(stderr, "\n"); ASSERT(pc == nbcs+1); } -#endif /* GHCI */ +#endif /* DEBUG */