X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FDisassembler.c;h=f8660e677b7abc452df47420b6afcb1cb5d38f0d;hb=272a418428beede04a9c4ae027474878c59d6ca1;hp=29d40d6479bfda7a202298a3ca1fc938bebb3b81;hpb=8f417a2d02071611eb5c06ae99eda1e2190e4de2;p=ghc-hetmet.git diff --git a/ghc/rts/Disassembler.c b/ghc/rts/Disassembler.c index 29d40d6..f8660e6 100644 --- a/ghc/rts/Disassembler.c +++ b/ghc/rts/Disassembler.c @@ -1,16 +1,16 @@ - /* ----------------------------------------------------------------------------- * Bytecode disassembler * - * Copyright (c) 1994-1998. + * Copyright (c) 1994-2002. * * $RCSfile: Disassembler.c,v $ - * $Revision: 1.17 $ - * $Date: 2001/01/03 16:44:30 $ + * $Revision: 1.27 $ + * $Date: 2003/03/25 17:04:09 $ * ---------------------------------------------------------------------------*/ -#ifdef GHCI +#ifdef DEBUG +#include "PosixSource.h" #include "Rts.h" #include "RtsAPI.h" #include "RtsUtils.h" @@ -23,16 +23,18 @@ #include "Disassembler.h" #include "Interpreter.h" +#include + /* -------------------------------------------------------------------------- * Disassembler * ------------------------------------------------------------------------*/ -int disInstr ( StgBCO *bco, int pc ) +int +disInstr ( StgBCO *bco, int pc ) { int i; - StgArrWords* instr_arr = bco->instrs; - UShort* instrs = (UShort*)(&instr_arr->payload[0]); + StgWord16* instrs = (StgWord16*)(bco->instrs->payload); StgArrWords* literal_arr = bco->literals; StgWord* literals = (StgWord*)(&literal_arr->payload[0]); @@ -44,8 +46,16 @@ int disInstr ( StgBCO *bco, int pc ) StgInfoTable** itbls = (StgInfoTable**)(&itbls_arr->payload[0]); switch (instrs[pc++]) { - case bci_ARGCHECK: - fprintf(stderr, "ARGCHECK %d\n", 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_PUSH_L: fprintf(stderr, "PUSH_L %d\n", instrs[pc] ); @@ -61,83 +71,169 @@ int disInstr ( StgBCO *bco, int 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]] ); - pc += 2; break; + + case bci_PUSH_ALTS: + fprintf(stderr, "PUSH_ALTS " ); printPtr( ptrs[instrs[pc]] ); + fprintf(stderr, "\n"); + pc += 1; break; + case bci_PUSH_ALTS_P: + fprintf(stderr, "PUSH_ALTS_P " ); printPtr( ptrs[instrs[pc]] ); + fprintf(stderr, "\n"); + pc += 1; break; + case bci_PUSH_ALTS_N: + fprintf(stderr, "PUSH_ALTS_N " ); printPtr( ptrs[instrs[pc]] ); + fprintf(stderr, "\n"); + pc += 1; break; + case bci_PUSH_ALTS_F: + fprintf(stderr, "PUSH_ALTS_F " ); printPtr( ptrs[instrs[pc]] ); + fprintf(stderr, "\n"); + pc += 1; break; + case bci_PUSH_ALTS_D: + fprintf(stderr, "PUSH_ALTS_D " ); printPtr( ptrs[instrs[pc]] ); + fprintf(stderr, "\n"); + pc += 1; break; + case bci_PUSH_ALTS_L: + fprintf(stderr, "PUSH_ALTS_L " ); printPtr( ptrs[instrs[pc]] ); + fprintf(stderr, "\n"); + pc += 1; break; + case bci_PUSH_ALTS_V: + fprintf(stderr, "PUSH_ALTS_V " ); printPtr( ptrs[instrs[pc]] ); + fprintf(stderr, "\n"); + pc += 1; break; + case bci_PUSH_UBX: fprintf(stderr, "PUSH_UBX "); for (i = 0; i < instrs[pc+1]; i++) fprintf(stderr, "0x%x ", literals[i + instrs[pc]] ); fprintf(stderr, "\n"); pc += 2; break; - case bci_PUSH_TAG: - fprintf(stderr, "PUSH_TAG %d\n", instrs[pc] ); - pc += 1; break; + case bci_PUSH_APPLY_N: + fprintf(stderr, "PUSH_APPLY_N\n"); + break; + case bci_PUSH_APPLY_V: + fprintf(stderr, "PUSH_APPLY_V\n"); + break; + case bci_PUSH_APPLY_F: + fprintf(stderr, "PUSH_APPLY_F\n"); + break; + case bci_PUSH_APPLY_D: + fprintf(stderr, "PUSH_APPLY_D\n"); + break; + case bci_PUSH_APPLY_L: + fprintf(stderr, "PUSH_APPLY_L\n"); + break; + case bci_PUSH_APPLY_P: + fprintf(stderr, "PUSH_APPLY_P\n"); + break; + case bci_PUSH_APPLY_PP: + fprintf(stderr, "PUSH_APPLY_PP\n"); + break; + case bci_PUSH_APPLY_PPP: + fprintf(stderr, "PUSH_APPLY_PPP\n"); + break; + case bci_PUSH_APPLY_PPPP: + fprintf(stderr, "PUSH_APPLY_PPPP\n"); + break; + case bci_PUSH_APPLY_PPPPP: + fprintf(stderr, "PUSH_APPLY_PPPPP\n"); + break; + case bci_PUSH_APPLY_PPPPPP: + fprintf(stderr, "PUSH_APPLY_PPPPPP\n"); + break; + case bci_PUSH_APPLY_PPPPPPP: + fprintf(stderr, "PUSH_APPLY_PPPPPPP\n"); + break; case bci_SLIDE: - fprintf(stderr, "SLIDE %d down by %d\n", instrs[pc], instrs[pc+1] ); + fprintf(stderr, "SLIDE %d down by %d\n", instrs[pc], instrs[pc+1] ); pc += 2; break; - case bci_ALLOC: - fprintf(stderr, "ALLOC %d words\n", instrs[pc] ); + case bci_ALLOC_AP: + fprintf(stderr, "ALLOC_AP %d words\n", instrs[pc] ); pc += 1; break; + case bci_ALLOC_PAP: + fprintf(stderr, "ALLOC_PAP %d words, %d arity\n", + instrs[pc], instrs[pc+1] ); + pc += 2; break; case bci_MKAP: - fprintf(stderr, "MKAP %d words, %d stkoff\n", instrs[pc+1], + fprintf(stderr, "MKAP %d words, %d stkoff\n", instrs[pc+1], instrs[pc] ); pc += 2; break; case bci_UNPACK: - fprintf(stderr, "UNPACK %d\n", instrs[pc] ); + fprintf(stderr, "UNPACK %d\n", instrs[pc] ); pc += 1; break; - case bci_UPK_TAG: - fprintf(stderr, "UPK_TAG %d words, %d conoff, %d stkoff\n", - instrs[pc], instrs[pc+1], instrs[pc+2] ); - pc += 3; break; case bci_PACK: - fprintf(stderr, "PACK %d words with itbl ", instrs[pc+1] ); + fprintf(stderr, "PACK %d words with itbl ", instrs[pc+1] ); printPtr( (StgPtr)itbls[instrs[pc]] ); + fprintf(stderr, "\n"); pc += 2; break; case bci_TESTLT_I: - fprintf(stderr, "TESTLT_I %d, fail to %d\n", literals[instrs[pc]], + fprintf(stderr, "TESTLT_I %d, fail to %d\n", literals[instrs[pc]], instrs[pc+1]); pc += 2; break; case bci_TESTEQ_I: - fprintf(stderr, "TESTEQ_I %d, fail to %d\n", literals[instrs[pc]], + fprintf(stderr, "TESTEQ_I %d, fail to %d\n", literals[instrs[pc]], instrs[pc+1]); pc += 2; break; case bci_TESTLT_F: - fprintf(stderr, "TESTLT_F %d, fail to %d\n", literals[instrs[pc]], + fprintf(stderr, "TESTLT_F %d, fail to %d\n", literals[instrs[pc]], instrs[pc+1]); pc += 2; break; case bci_TESTEQ_F: - fprintf(stderr, "TESTEQ_F %d, fail to %d\n", literals[instrs[pc]], + fprintf(stderr, "TESTEQ_F %d, fail to %d\n", literals[instrs[pc]], instrs[pc+1]); pc += 2; break; case bci_TESTLT_D: - fprintf(stderr, "TESTLT_D %d, fail to %d\n", literals[instrs[pc]], + fprintf(stderr, "TESTLT_D %d, fail to %d\n", literals[instrs[pc]], instrs[pc+1]); pc += 2; break; case bci_TESTEQ_D: - fprintf(stderr, "TESTEQ_D %d, fail to %d\n", literals[instrs[pc]], + fprintf(stderr, "TESTEQ_D %d, fail to %d\n", literals[instrs[pc]], instrs[pc+1]); pc += 2; break; case bci_TESTLT_P: - fprintf(stderr, "TESTLT_P %d, fail to %d\n", instrs[pc], + fprintf(stderr, "TESTLT_P %d, fail to %d\n", instrs[pc], instrs[pc+1]); pc += 2; break; case bci_TESTEQ_P: - fprintf(stderr, "TESTEQ_P %d, fail to %d\n", instrs[pc], + fprintf(stderr, "TESTEQ_P %d, fail to %d\n", instrs[pc], instrs[pc+1]); pc += 2; break; - case bci_RETURN: - fprintf(stderr, "RETURN " ); printPtr( (StgPtr)itbls[instrs[pc]] ); - fprintf(stderr, "\n"); + case bci_CASEFAIL: + fprintf(stderr, "CASEFAIL\n" ); + break; + case bci_JMP: + fprintf(stderr, "JMP to %d\n", instrs[pc]); pc += 1; break; + case bci_ENTER: fprintf(stderr, "ENTER\n"); break; + + case bci_RETURN: + fprintf(stderr, "RETURN\n" ); + break; + case bci_RETURN_P: + fprintf(stderr, "RETURN_P\n" ); + break; + case bci_RETURN_N: + fprintf(stderr, "RETURN_N\n" ); + break; + case bci_RETURN_F: + fprintf(stderr, "RETURN_F\n" ); + break; + case bci_RETURN_D: + fprintf(stderr, "RETURN_D\n" ); + break; + case bci_RETURN_L: + fprintf(stderr, "RETURN_L\n" ); + break; + case bci_RETURN_V: + fprintf(stderr, "RETURN_V\n" ); + break; + default: barf("disInstr: unknown opcode"); } @@ -153,8 +249,7 @@ 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]); + StgWord16* instrs = (StgWord16*)(bco->instrs->payload); StgMutArrPtrs* ptrs = bco->ptrs; nat nbcs = (int)instrs[0]; nat pc = 1; @@ -188,4 +283,4 @@ void disassemble( StgBCO *bco ) ASSERT(pc == nbcs+1); } -#endif /* GHCI */ +#endif /* DEBUG */