projects
/
mono.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge pull request #2854 from alexrp/lock-free-queue-docs
[mono.git]
/
mono
/
mini
/
mini-codegen.c
diff --git
a/mono/mini/mini-codegen.c
b/mono/mini/mini-codegen.c
index c6efc5b78f864f67a42613376e6462921b8c9a02..db26f1b5c523fb34ec53fe186b302ffbcbd4c2d3 100644
(file)
--- a/
mono/mini/mini-codegen.c
+++ b/
mono/mini/mini-codegen.c
@@
-144,7
+144,7
@@
mono_regstate_assign (MonoRegState *rs)
if (rs->next_vreg > rs->vassign_size) {
g_free (rs->vassign);
rs->vassign_size = MAX (rs->next_vreg, 256);
if (rs->next_vreg > rs->vassign_size) {
g_free (rs->vassign);
rs->vassign_size = MAX (rs->next_vreg, 256);
- rs->vassign = g_malloc (rs->vassign_size * sizeof (gint32));
+ rs->vassign =
(gint32 *)
g_malloc (rs->vassign_size * sizeof (gint32));
}
memset (rs->isymbolic, 0, MONO_MAX_IREGS * sizeof (rs->isymbolic [0]));
}
memset (rs->isymbolic, 0, MONO_MAX_IREGS * sizeof (rs->isymbolic [0]));
@@
-295,7
+295,7
@@
resize_spill_info (MonoCompile *cfg, int bank)
g_assert (bank < MONO_NUM_REGBANKS);
g_assert (bank < MONO_NUM_REGBANKS);
- new_info = mono_mempool_alloc0 (cfg->mempool, sizeof (MonoSpillInfo) * new_len);
+ new_info =
(MonoSpillInfo *)
mono_mempool_alloc0 (cfg->mempool, sizeof (MonoSpillInfo) * new_len);
if (orig_info)
memcpy (new_info, orig_info, sizeof (MonoSpillInfo) * orig_len);
for (i = orig_len; i < new_len; ++i)
if (orig_info)
memcpy (new_info, orig_info, sizeof (MonoSpillInfo) * orig_len);
for (i = orig_len; i < new_len; ++i)
@@
-419,6
+419,12
@@
static const char* const patch_info_str[] = {
#undef PATCH_INFO
};
#undef PATCH_INFO
};
+const char*
+mono_ji_type_to_string (MonoJumpInfoType type)
+{
+ return patch_info_str [type];
+}
+
void
mono_print_ji (const MonoJumpInfo *ji)
{
void
mono_print_ji (const MonoJumpInfo *ji)
{
@@
-437,6
+443,10
@@
mono_print_ji (const MonoJumpInfo *ji)
g_free (s);
break;
}
g_free (s);
break;
}
+ case MONO_PATCH_INFO_INTERNAL_METHOD: {
+ printf ("[INTERNAL_METHOD - %s]", ji->data.name);
+ break;
+ }
default:
printf ("[%s]", patch_info_str [ji->type]);
break;
default:
printf ("[%s]", patch_info_str [ji->type]);
break;
@@
-445,15
+455,24
@@
mono_print_ji (const MonoJumpInfo *ji)
void
mono_print_ins_index (int i, MonoInst *ins)
void
mono_print_ins_index (int i, MonoInst *ins)
+{
+ GString *buf = mono_print_ins_index_strbuf (i, ins);
+ printf ("%s\n", buf->str);
+ g_string_free (buf, TRUE);
+}
+
+GString *
+mono_print_ins_index_strbuf (int i, MonoInst *ins)
{
const char *spec = ins_get_spec (ins->opcode);
{
const char *spec = ins_get_spec (ins->opcode);
+ GString *sbuf = g_string_new (NULL);
int num_sregs, j;
int sregs [MONO_MAX_SRC_REGS];
if (i != -1)
int num_sregs, j;
int sregs [MONO_MAX_SRC_REGS];
if (i != -1)
-
printf (
"\t%-2d %s", i, mono_inst_name (ins->opcode));
+
g_string_append_printf (sbuf,
"\t%-2d %s", i, mono_inst_name (ins->opcode));
else
else
-
printf (
" %s", mono_inst_name (ins->opcode));
+
g_string_append_printf (sbuf,
" %s", mono_inst_name (ins->opcode));
if (spec == MONO_ARCH_CPU_SPEC) {
gboolean dest_base = FALSE;
switch (ins->opcode) {
if (spec == MONO_ARCH_CPU_SPEC) {
gboolean dest_base = FALSE;
switch (ins->opcode) {
@@
-467,16
+486,16
@@
mono_print_ins_index (int i, MonoInst *ins)
/* This is a lowered opcode */
if (ins->dreg != -1) {
if (dest_base)
/* This is a lowered opcode */
if (ins->dreg != -1) {
if (dest_base)
-
printf (
" [R%d + 0x%lx] <-", ins->dreg, (long)ins->inst_offset);
+
g_string_append_printf (sbuf,
" [R%d + 0x%lx] <-", ins->dreg, (long)ins->inst_offset);
else
else
-
printf (
" R%d <-", ins->dreg);
+
g_string_append_printf (sbuf,
" R%d <-", ins->dreg);
}
if (ins->sreg1 != -1)
}
if (ins->sreg1 != -1)
-
printf (
" R%d", ins->sreg1);
+
g_string_append_printf (sbuf,
" R%d", ins->sreg1);
if (ins->sreg2 != -1)
if (ins->sreg2 != -1)
-
printf (
" R%d", ins->sreg2);
+
g_string_append_printf (sbuf,
" R%d", ins->sreg2);
if (ins->sreg3 != -1)
if (ins->sreg3 != -1)
-
printf (
" R%d", ins->sreg3);
+
g_string_append_printf (sbuf,
" R%d", ins->sreg3);
switch (ins->opcode) {
case OP_LBNE_UN:
switch (ins->opcode) {
case OP_LBNE_UN:
@@
-490,39
+509,38
@@
mono_print_ins_index (int i, MonoInst *ins)
case OP_LBLE:
case OP_LBLE_UN:
if (!ins->inst_false_bb)
case OP_LBLE:
case OP_LBLE_UN:
if (!ins->inst_false_bb)
-
printf (
" [B%d]", ins->inst_true_bb->block_num);
+
g_string_append_printf (sbuf,
" [B%d]", ins->inst_true_bb->block_num);
else
else
-
printf (
" [B%dB%d]", ins->inst_true_bb->block_num, ins->inst_false_bb->block_num);
+
g_string_append_printf (sbuf,
" [B%dB%d]", ins->inst_true_bb->block_num, ins->inst_false_bb->block_num);
break;
case OP_PHI:
case OP_VPHI:
case OP_XPHI:
case OP_FPHI: {
int i;
break;
case OP_PHI:
case OP_VPHI:
case OP_XPHI:
case OP_FPHI: {
int i;
-
printf (
" [%d (", (int)ins->inst_c0);
+
g_string_append_printf (sbuf,
" [%d (", (int)ins->inst_c0);
for (i = 0; i < ins->inst_phi_args [0]; i++) {
if (i)
for (i = 0; i < ins->inst_phi_args [0]; i++) {
if (i)
-
printf (
", ");
-
printf (
"R%d", ins->inst_phi_args [i + 1]);
+
g_string_append_printf (sbuf,
", ");
+
g_string_append_printf (sbuf,
"R%d", ins->inst_phi_args [i + 1]);
}
}
-
printf (
")]");
+
g_string_append_printf (sbuf,
")]");
break;
}
case OP_LDADDR:
case OP_OUTARG_VTRETADDR:
break;
}
case OP_LDADDR:
case OP_OUTARG_VTRETADDR:
-
printf (
" R%d", ((MonoInst*)ins->inst_p0)->dreg);
+
g_string_append_printf (sbuf,
" R%d", ((MonoInst*)ins->inst_p0)->dreg);
break;
case OP_REGOFFSET:
case OP_GSHAREDVT_ARG_REGOFFSET:
break;
case OP_REGOFFSET:
case OP_GSHAREDVT_ARG_REGOFFSET:
-
printf (
" + 0x%lx", (long)ins->inst_offset);
+
g_string_append_printf (sbuf,
" + 0x%lx", (long)ins->inst_offset);
break;
default:
break;
}
break;
default:
break;
}
- printf ("\n");
//g_error ("Unknown opcode: %s\n", mono_inst_name (ins->opcode));
//g_error ("Unknown opcode: %s\n", mono_inst_name (ins->opcode));
- return;
+ return
sbuf
;
}
if (spec [MONO_INST_DEST]) {
}
if (spec [MONO_INST_DEST]) {
@@
-530,44
+548,44
@@
mono_print_ins_index (int i, MonoInst *ins)
if (is_soft_reg (ins->dreg, bank)) {
if (spec [MONO_INST_DEST] == 'b') {
if (ins->inst_offset == 0)
if (is_soft_reg (ins->dreg, bank)) {
if (spec [MONO_INST_DEST] == 'b') {
if (ins->inst_offset == 0)
-
printf (
" [R%d] <-", ins->dreg);
+
g_string_append_printf (sbuf,
" [R%d] <-", ins->dreg);
else
else
-
printf (
" [R%d + 0x%lx] <-", ins->dreg, (long)ins->inst_offset);
+
g_string_append_printf (sbuf,
" [R%d + 0x%lx] <-", ins->dreg, (long)ins->inst_offset);
}
else
}
else
-
printf (
" R%d <-", ins->dreg);
+
g_string_append_printf (sbuf,
" R%d <-", ins->dreg);
} else if (spec [MONO_INST_DEST] == 'b') {
if (ins->inst_offset == 0)
} else if (spec [MONO_INST_DEST] == 'b') {
if (ins->inst_offset == 0)
-
printf (
" [%s] <-", mono_arch_regname (ins->dreg));
+
g_string_append_printf (sbuf,
" [%s] <-", mono_arch_regname (ins->dreg));
else
else
-
printf (
" [%s + 0x%lx] <-", mono_arch_regname (ins->dreg), (long)ins->inst_offset);
+
g_string_append_printf (sbuf,
" [%s + 0x%lx] <-", mono_arch_regname (ins->dreg), (long)ins->inst_offset);
} else
} else
-
printf (
" %s <-", mono_regname_full (ins->dreg, bank));
+
g_string_append_printf (sbuf,
" %s <-", mono_regname_full (ins->dreg, bank));
}
if (spec [MONO_INST_SRC1]) {
int bank = sreg1_bank (spec);
if (is_soft_reg (ins->sreg1, bank)) {
if (spec [MONO_INST_SRC1] == 'b')
}
if (spec [MONO_INST_SRC1]) {
int bank = sreg1_bank (spec);
if (is_soft_reg (ins->sreg1, bank)) {
if (spec [MONO_INST_SRC1] == 'b')
-
printf (
" [R%d + 0x%lx]", ins->sreg1, (long)ins->inst_offset);
+
g_string_append_printf (sbuf,
" [R%d + 0x%lx]", ins->sreg1, (long)ins->inst_offset);
else
else
-
printf (
" R%d", ins->sreg1);
+
g_string_append_printf (sbuf,
" R%d", ins->sreg1);
} else if (spec [MONO_INST_SRC1] == 'b')
} else if (spec [MONO_INST_SRC1] == 'b')
-
printf (
" [%s + 0x%lx]", mono_arch_regname (ins->sreg1), (long)ins->inst_offset);
+
g_string_append_printf (sbuf,
" [%s + 0x%lx]", mono_arch_regname (ins->sreg1), (long)ins->inst_offset);
else
else
-
printf (
" %s", mono_regname_full (ins->sreg1, bank));
+
g_string_append_printf (sbuf,
" %s", mono_regname_full (ins->sreg1, bank));
}
num_sregs = mono_inst_get_src_registers (ins, sregs);
for (j = 1; j < num_sregs; ++j) {
int bank = sreg_bank (j, spec);
if (is_soft_reg (sregs [j], bank))
}
num_sregs = mono_inst_get_src_registers (ins, sregs);
for (j = 1; j < num_sregs; ++j) {
int bank = sreg_bank (j, spec);
if (is_soft_reg (sregs [j], bank))
-
printf (
" R%d", sregs [j]);
+
g_string_append_printf (sbuf,
" R%d", sregs [j]);
else
else
-
printf (
" %s", mono_regname_full (sregs [j], bank));
+
g_string_append_printf (sbuf,
" %s", mono_regname_full (sregs [j], bank));
}
switch (ins->opcode) {
case OP_ICONST:
}
switch (ins->opcode) {
case OP_ICONST:
-
printf (
" [%d]", (int)ins->inst_c0);
+
g_string_append_printf (sbuf,
" [%d]", (int)ins->inst_c0);
break;
#if defined(TARGET_X86) || defined(TARGET_AMD64)
case OP_X86_PUSH_IMM:
break;
#if defined(TARGET_X86) || defined(TARGET_AMD64)
case OP_X86_PUSH_IMM:
@@
-581,20
+599,20
@@
mono_print_ins_index (int i, MonoInst *ins)
case OP_IXOR_IMM:
case OP_SUB_IMM:
case OP_STORE_MEMBASE_IMM:
case OP_IXOR_IMM:
case OP_SUB_IMM:
case OP_STORE_MEMBASE_IMM:
-
printf (
" [%d]", (int)ins->inst_imm);
+
g_string_append_printf (sbuf,
" [%d]", (int)ins->inst_imm);
break;
case OP_ADD_IMM:
case OP_LADD_IMM:
break;
case OP_ADD_IMM:
case OP_LADD_IMM:
-
printf (
" [%d]", (int)(gssize)ins->inst_p1);
+
g_string_append_printf (sbuf,
" [%d]", (int)(gssize)ins->inst_p1);
break;
case OP_I8CONST:
break;
case OP_I8CONST:
-
printf (
" [%lld]", (long long)ins->inst_l);
+
g_string_append_printf (sbuf,
" [%lld]", (long long)ins->inst_l);
break;
case OP_R8CONST:
break;
case OP_R8CONST:
-
printf (
" [%f]", *(double*)ins->inst_p0);
+
g_string_append_printf (sbuf,
" [%f]", *(double*)ins->inst_p0);
break;
case OP_R4CONST:
break;
case OP_R4CONST:
-
printf (
" [%f]", *(float*)ins->inst_p0);
+
g_string_append_printf (sbuf,
" [%f]", *(float*)ins->inst_p0);
break;
case OP_CALL:
case OP_CALL_MEMBASE:
break;
case OP_CALL:
case OP_CALL_MEMBASE:
@@
-619,22
+637,22
@@
mono_print_ins_index (int i, MonoInst *ins)
* JIT passes them to backends.
*/
if (ins->dreg != -1)
* JIT passes them to backends.
*/
if (ins->dreg != -1)
-
printf (
" R%d <-", ins->dreg);
+
g_string_append_printf (sbuf,
" R%d <-", ins->dreg);
}
if (call->method) {
char *full_name = mono_method_full_name (call->method, TRUE);
}
if (call->method) {
char *full_name = mono_method_full_name (call->method, TRUE);
-
printf (
" [%s]", full_name);
+
g_string_append_printf (sbuf,
" [%s]", full_name);
g_free (full_name);
} else if (call->fptr_is_patch) {
MonoJumpInfo *ji = (MonoJumpInfo*)call->fptr;
g_free (full_name);
} else if (call->fptr_is_patch) {
MonoJumpInfo *ji = (MonoJumpInfo*)call->fptr;
-
printf (
" ");
+
g_string_append_printf (sbuf,
" ");
mono_print_ji (ji);
} else if (call->fptr) {
MonoJitICallInfo *info = mono_find_jit_icall_by_addr (call->fptr);
if (info)
mono_print_ji (ji);
} else if (call->fptr) {
MonoJitICallInfo *info = mono_find_jit_icall_by_addr (call->fptr);
if (info)
-
printf (
" [%s]", info->name);
+
g_string_append_printf (sbuf,
" [%s]", info->name);
}
list = call->out_ireg_args;
}
list = call->out_ireg_args;
@@
-646,7
+664,7
@@
mono_print_ins_index (int i, MonoInst *ins)
hreg = regpair >> 24;
reg = regpair & 0xffffff;
hreg = regpair >> 24;
reg = regpair & 0xffffff;
-
printf (
" [%s <- R%d]", mono_arch_regname (hreg), reg);
+
g_string_append_printf (sbuf,
" [%s <- R%d]", mono_arch_regname (hreg), reg);
list = g_slist_next (list);
}
list = g_slist_next (list);
}
@@
-659,7
+677,7
@@
mono_print_ins_index (int i, MonoInst *ins)
hreg = regpair >> 24;
reg = regpair & 0xffffff;
hreg = regpair >> 24;
reg = regpair & 0xffffff;
-
printf (
" [%s <- R%d]", mono_arch_fregname (hreg), reg);
+
g_string_append_printf (sbuf,
" [%s <- R%d]", mono_arch_fregname (hreg), reg);
list = g_slist_next (list);
}
list = g_slist_next (list);
}
@@
-667,7
+685,7
@@
mono_print_ins_index (int i, MonoInst *ins)
}
case OP_BR:
case OP_CALL_HANDLER:
}
case OP_BR:
case OP_CALL_HANDLER:
-
printf (
" [B%d]", ins->inst_target_bb->block_num);
+
g_string_append_printf (sbuf,
" [B%d]", ins->inst_target_bb->block_num);
break;
case OP_IBNE_UN:
case OP_IBEQ:
break;
case OP_IBNE_UN:
case OP_IBEQ:
@@
-690,27
+708,27
@@
mono_print_ins_index (int i, MonoInst *ins)
case OP_LBLE:
case OP_LBLE_UN:
if (!ins->inst_false_bb)
case OP_LBLE:
case OP_LBLE_UN:
if (!ins->inst_false_bb)
-
printf (
" [B%d]", ins->inst_true_bb->block_num);
+
g_string_append_printf (sbuf,
" [B%d]", ins->inst_true_bb->block_num);
else
else
-
printf (
" [B%dB%d]", ins->inst_true_bb->block_num, ins->inst_false_bb->block_num);
+
g_string_append_printf (sbuf,
" [B%dB%d]", ins->inst_true_bb->block_num, ins->inst_false_bb->block_num);
break;
case OP_LIVERANGE_START:
case OP_LIVERANGE_END:
case OP_GC_LIVENESS_DEF:
case OP_GC_LIVENESS_USE:
break;
case OP_LIVERANGE_START:
case OP_LIVERANGE_END:
case OP_GC_LIVENESS_DEF:
case OP_GC_LIVENESS_USE:
-
printf (
" R%d", (int)ins->inst_c1);
+
g_string_append_printf (sbuf,
" R%d", (int)ins->inst_c1);
break;
case OP_IL_SEQ_POINT:
case OP_SEQ_POINT:
break;
case OP_IL_SEQ_POINT:
case OP_SEQ_POINT:
-
printf (
" il: 0x%x%s", (int)ins->inst_imm, ins->flags & MONO_INST_NONEMPTY_STACK ? ", nonempty-stack" : "");
+
g_string_append_printf (sbuf,
" il: 0x%x%s", (int)ins->inst_imm, ins->flags & MONO_INST_NONEMPTY_STACK ? ", nonempty-stack" : "");
break;
default:
break;
}
if (spec [MONO_INST_CLOB])
break;
default:
break;
}
if (spec [MONO_INST_CLOB])
-
printf (
" clobbers: %c", spec [MONO_INST_CLOB]);
-
printf ("\n")
;
+
g_string_append_printf (sbuf,
" clobbers: %c", spec [MONO_INST_CLOB]);
+
return sbuf
;
}
static void
}
static void
@@
-733,6
+751,12
@@
print_regtrack (RegTrack *t, int num)
}
#else
}
#else
+const char*
+mono_ji_type_to_string (MonoJumpInfoType type)
+{
+ return "";
+}
+
void
mono_print_ji (const MonoJumpInfo *ji)
{
void
mono_print_ji (const MonoJumpInfo *ji)
{
@@
-1164,10
+1188,11
@@
mono_local_regalloc (MonoCompile *cfg, MonoBasicBlock *bb)
if (cfg->reginfo && cfg->reginfo_len < max)
cfg->reginfo = NULL;
if (cfg->reginfo && cfg->reginfo_len < max)
cfg->reginfo = NULL;
- reginfo = cfg->reginfo;
+ reginfo =
(RegTrack *)
cfg->reginfo;
if (!reginfo) {
cfg->reginfo_len = MAX (1024, max * 2);
if (!reginfo) {
cfg->reginfo_len = MAX (1024, max * 2);
- reginfo = cfg->reginfo = mono_mempool_alloc (cfg->mempool, sizeof (RegTrack) * cfg->reginfo_len);
+ reginfo = (RegTrack *)mono_mempool_alloc (cfg->mempool, sizeof (RegTrack) * cfg->reginfo_len);
+ cfg->reginfo = reginfo;
}
else
g_assert (cfg->reginfo_len >= rs->next_vreg);
}
else
g_assert (cfg->reginfo_len >= rs->next_vreg);
@@
-2434,7
+2459,7
@@
mono_opcode_to_cond (int opcode)
default:
printf ("%s\n", mono_inst_name (opcode));
g_assert_not_reached ();
default:
printf ("%s\n", mono_inst_name (opcode));
g_assert_not_reached ();
- return 0;
+ return
(CompRelation)
0;
}
}
}
}
@@
-2496,7
+2521,7
@@
mono_opcode_to_type (int opcode, int cmp_opcode)
}
} else {
g_error ("Unknown opcode '%s' in opcode_to_type", mono_inst_name (opcode));
}
} else {
g_error ("Unknown opcode '%s' in opcode_to_type", mono_inst_name (opcode));
- return 0;
+ return
(CompType)
0;
}
}
}
}