diff options
author | Oswald Buddenhagen <oswald.buddenhagen@qt.io> | 2017-05-30 12:48:17 +0200 |
---|---|---|
committer | Oswald Buddenhagen <oswald.buddenhagen@qt.io> | 2017-05-30 12:48:17 +0200 |
commit | 881da28418d380042aa95a97f0cbd42560a64f7c (patch) | |
tree | a794dff3274695e99c651902dde93d934ea7a5af /Source/JavaScriptCore/disassembler/udis86 | |
parent | 7e104c57a70fdf551bb3d22a5d637cdcbc69dbea (diff) | |
parent | 0fcedcd17cc00d3dd44c718b3cb36c1033319671 (diff) | |
download | qtwebkit-881da28418d380042aa95a97f0cbd42560a64f7c.tar.gz |
Merge 'wip/next' into dev
Change-Id: Iff9ee5e23bb326c4371ec8ed81d56f2f05d680e9
Diffstat (limited to 'Source/JavaScriptCore/disassembler/udis86')
5 files changed, 47 insertions, 29 deletions
diff --git a/Source/JavaScriptCore/disassembler/udis86/itab.py b/Source/JavaScriptCore/disassembler/udis86/itab.py index 90bd3e02c..3d50ad061 100644 --- a/Source/JavaScriptCore/disassembler/udis86/itab.py +++ b/Source/JavaScriptCore/disassembler/udis86/itab.py @@ -314,7 +314,7 @@ class UdItabGenerator( ud_opcode.UdOpcodeTables ): self.ItabH.write( "\n" ) self.ItabH.write("\n/* itab entry operand definitions */\n"); - operands = list( self.OperandDict.keys() ) + operands = self.OperandDict.keys() operands.sort() for o in operands: self.ItabH.write("#define O_%-7s { %-12s %-8s }\n" % diff --git a/Source/JavaScriptCore/disassembler/udis86/udis86_decode.c b/Source/JavaScriptCore/disassembler/udis86/udis86_decode.c index 3d567b6df..579903642 100644 --- a/Source/JavaScriptCore/disassembler/udis86/udis86_decode.c +++ b/Source/JavaScriptCore/disassembler/udis86/udis86_decode.c @@ -459,6 +459,8 @@ decode_modrm_rm(struct ud *u, rm = (REX_B(u->pfx_rex) << 3) | MODRM_RM(modrm(u)); reg = (REX_R(u->pfx_rex) << 3) | MODRM_REG(modrm(u)); + UNUSED_PARAM(reg); + op->size = resolve_operand_size(u, size); /* @@ -650,7 +652,6 @@ decode_operand(struct ud *u, case OP_E: decode_modrm_rm(u, operand, T_GPR, size); break; - break; case OP_G: decode_modrm_reg(u, operand, T_GPR, size); break; diff --git a/Source/JavaScriptCore/disassembler/udis86/udis86_syn-att.c b/Source/JavaScriptCore/disassembler/udis86/udis86_syn-att.c index 0d1c57d48..c9c84880a 100644 --- a/Source/JavaScriptCore/disassembler/udis86/udis86_syn-att.c +++ b/Source/JavaScriptCore/disassembler/udis86/udis86_syn-att.c @@ -66,14 +66,25 @@ gen_operand(struct ud* u, struct ud_operand* op) if (op->offset == 8) { if (op->lval.sbyte < 0) mkasm(u, "-0x%x", (-op->lval.sbyte) & 0xff); - else mkasm(u, "0x%x", op->lval.sbyte); + else + mkasm(u, "0x%x", op->lval.sbyte); } - else if (op->offset == 16) - mkasm(u, "0x%x", op->lval.uword); - else if (op->offset == 32) - mkasm(u, "0x%lx", (unsigned long)op->lval.udword); - else if (op->offset == 64) - mkasm(u, "0x" FMT64 "x", op->lval.uqword); + else if (op->offset == 16) { + if (op->lval.sword < 0) + mkasm(u, "-0x%x", (-op->lval.sword) & 0xffff); + else + mkasm(u, "0x%x", op->lval.sword); + } else if (op->offset == 32) { + if (op->lval.sdword < 0) + mkasm(u, "-0x%x", (-op->lval.sdword) & 0xffffffff); + else + mkasm(u, "0x%x", op->lval.sdword); + } else if (op->offset == 64) { + if (op->lval.sdword < 0) + mkasm(u, "-0x" FMT64 "x", (uint64_t)-op->lval.sqword); + else + mkasm(u, "0x" FMT64 "x", (uint64_t)op->lval.sqword); + } if (op->base) mkasm(u, "(%%%s", ud_reg_tab[op->base - UD_R_AL]); @@ -108,7 +119,7 @@ gen_operand(struct ud* u, struct ud_operand* op) } if ( sext_size < 64 ) sext_mask = ( 1ull << sext_size ) - 1; - mkasm( u, "$0x" FMT64 "x", imm & sext_mask ); + mkasm( u, "$0x" FMT64 "x", (uint64_t)(imm & sext_mask) ); break; } @@ -116,16 +127,16 @@ gen_operand(struct ud* u, struct ud_operand* op) case UD_OP_JIMM: switch (op->size) { case 8: - mkasm(u, "0x" FMT64 "x", u->pc + op->lval.sbyte); + mkasm(u, "0x" FMT64 "x", (uint64_t)(u->pc + op->lval.sbyte)); break; case 16: - mkasm(u, "0x" FMT64 "x", (u->pc + op->lval.sword) & 0xffff ); + mkasm(u, "0x" FMT64 "x", (uint64_t)((u->pc + op->lval.sword) & 0xffff) ); break; case 32: if (u->dis_mode == 32) - mkasm(u, "0x" FMT64 "x", (u->pc + op->lval.sdword) & 0xffffffff); + mkasm(u, "0x" FMT64 "x", (uint64_t)((u->pc + op->lval.sdword) & 0xffffffff)); else - mkasm(u, "0x" FMT64 "x", u->pc + op->lval.sdword); + mkasm(u, "0x" FMT64 "x", (uint64_t)(u->pc + op->lval.sdword)); break; default:break; } @@ -156,6 +167,7 @@ extern void ud_translate_att(struct ud *u) { int size = 0; + unsigned i; /* check if P_OSO prefix is used */ if (! P_OSO(u->itab_entry->prefix) && u->pfx_opr) { @@ -218,19 +230,20 @@ ud_translate_att(struct ud *u) mkasm(u, "%s", ud_lookup_mnemonic(u->mnemonic)); } - if (u->c1) - size = u->operand[0].size; - else if (u->c2) - size = u->operand[1].size; - else if (u->c3) - size = u->operand[2].size; + for (i = 3; i--;) { + if (u->operand[i].size > size + && u->operand[i].type != UD_OP_JIMM) + size = u->operand[i].size; + } if (size == 8) - mkasm(u, "b"); + mkasm(u, "b"); else if (size == 16) - mkasm(u, "w"); + mkasm(u, "w"); + else if (size == 32) + mkasm(u, "l"); else if (size == 64) - mkasm(u, "q"); + mkasm(u, "q"); mkasm(u, " "); diff --git a/Source/JavaScriptCore/disassembler/udis86/udis86_syn-intel.c b/Source/JavaScriptCore/disassembler/udis86/udis86_syn-intel.c index 38251db88..4ad42eb63 100644 --- a/Source/JavaScriptCore/disassembler/udis86/udis86_syn-intel.c +++ b/Source/JavaScriptCore/disassembler/udis86/udis86_syn-intel.c @@ -106,7 +106,7 @@ static void gen_operand(struct ud* u, struct ud_operand* op, int syn_cast) else mkasm(u, "%s0x%lx", (op_f) ? "+" : "", (unsigned long)op->lval.udword); } else if (op->offset == 64) - mkasm(u, "%s0x" FMT64 "x", (op_f) ? "+" : "", op->lval.uqword); + mkasm(u, "%s0x" FMT64 "x", (op_f) ? "+" : "", (uint64_t)op->lval.uqword); mkasm(u, "]"); break; @@ -133,7 +133,7 @@ static void gen_operand(struct ud* u, struct ud_operand* op, int syn_cast) } if ( sext_size < 64 ) sext_mask = ( 1ull << sext_size ) - 1; - mkasm( u, "0x" FMT64 "x", imm & sext_mask ); + mkasm( u, "0x" FMT64 "x", (uint64_t)(imm & sext_mask) ); break; } @@ -143,13 +143,13 @@ static void gen_operand(struct ud* u, struct ud_operand* op, int syn_cast) if (syn_cast) opr_cast(u, op); switch (op->size) { case 8: - mkasm(u, "0x" FMT64 "x", u->pc + op->lval.sbyte); + mkasm(u, "0x" FMT64 "x", (uint64_t)(u->pc + op->lval.sbyte)); break; case 16: - mkasm(u, "0x" FMT64 "x", ( u->pc + op->lval.sword ) & 0xffff ); + mkasm(u, "0x" FMT64 "x", (uint64_t)(( u->pc + op->lval.sword ) & 0xffff) ); break; case 32: - mkasm(u, "0x" FMT64 "x", ( u->pc + op->lval.sdword ) & 0xfffffffful ); + mkasm(u, "0x" FMT64 "x", (uint64_t)(( u->pc + op->lval.sdword ) & 0xfffffffful) ); break; default:break; } diff --git a/Source/JavaScriptCore/disassembler/udis86/udis86_types.h b/Source/JavaScriptCore/disassembler/udis86/udis86_types.h index 320d1ca49..176bf6d73 100644 --- a/Source/JavaScriptCore/disassembler/udis86/udis86_types.h +++ b/Source/JavaScriptCore/disassembler/udis86/udis86_types.h @@ -48,7 +48,11 @@ typedef __int32 int32_t; typedef __int64 int64_t; #else -# define FMT64 "%ll" +# if defined(__GNU_LIBRARY__) && defined(__WORDSIZE) && (__WORDSIZE == 64) +# define FMT64 "%l" +# else +# define FMT64 "%ll" +# endif # ifndef __UD_STANDALONE__ # include <inttypes.h> # endif /* __UD_STANDALONE__ */ |