From 154bfd46732a8d8525014851de1755cc1e2b51d4 Mon Sep 17 00:00:00 2001
From: marxin <mliska@suse.cz>
Date: Wed, 30 Sep 2015 14:56:45 +0200
Subject: [PATCH 3/3] HSA: dump BRIG section offsets in hsagen dump file.
gcc/ChangeLog:
2015-10-08 Martin Liska <mliska@suse.cz>
* hsa-brig.c (emit_comment_insn): Do not release comment's
string.
(emit_insn): Save BRIG offset.
(hsa_brig_emit_function): Dump generated HSAIL after BRIG
emission.
* hsa-dump.c (dump_hsa_insn): Dump BRIG offset of an
instruction.
* hsa-gen.c (hsa_insn_basic::hsa_insn_basic): Initialize
brig_offset to zero.
* hsa.h (hsa_insn_basic::brig_offset): New member variable.
---
gcc/hsa-brig.c | 24 +++++++++++++++++++++++-
gcc/hsa-dump.c | 32 +++++++++++++++++++-------------
gcc/hsa-gen.c | 2 ++
gcc/hsa.h | 3 +++
4 files changed, 47 insertions(+), 14 deletions(-)
@@ -137,6 +137,9 @@ static hash_set <tree> *emitted_declarations;
/* List of sbr instructions. */
static vec <hsa_insn_sbr *> *switch_instructions;
+/* List of comment instructions. */
+static vec <hsa_insn_comment *> *comment_instructions;
+
struct function_linkage_pair
{
function_linkage_pair (tree decl, unsigned int off):
@@ -1627,7 +1630,6 @@ emit_comment_insn (hsa_insn_comment *insn)
repr.base.kind = htole16 (insn->opcode);
repr.name = brig_emit_string (insn->comment, '\0', false);
brig_code.add (&repr, sizeof (repr));
- insn->release_string ();
}
/* Emit queue instruction INSN. */
@@ -1748,6 +1750,9 @@ static void
emit_insn (hsa_insn_basic *insn)
{
gcc_assert (!is_a <hsa_insn_phi *> (insn));
+
+ insn->brig_offset = brig_code.total_size;
+
if (hsa_insn_signal *signal = dyn_cast <hsa_insn_signal *> (insn))
{
emit_signal_insn (signal);
@@ -1805,6 +1810,11 @@ emit_insn (hsa_insn_basic *insn)
}
if (hsa_insn_comment *comment = dyn_cast <hsa_insn_comment *> (insn))
{
+ if (comment_instructions == NULL)
+ comment_instructions = new vec <hsa_insn_comment *> ();
+
+ comment_instructions->safe_push (comment);
+
emit_comment_insn (comment);
return;
}
@@ -1917,8 +1927,20 @@ hsa_brig_emit_function (void)
}
}
+ if (dump_file)
+ {
+ fprintf (dump_file, "------- After BRIG emission: -------\n");
+ dump_hsa_cfun (dump_file);
+ }
+
+ if (comment_instructions)
+ for (unsigned i = 0; i < comment_instructions->length (); i++)
+ (*comment_instructions)[i]->release_string ();
+
delete switch_instructions;
switch_instructions = NULL;
+ delete comment_instructions;
+ comment_instructions = NULL;
emit_queued_operands ();
}
@@ -791,7 +791,7 @@ dump_hsa_insn (FILE *f, hsa_insn_basic *insn, int *indent)
first = false;
dump_hsa_operand (f, phi->get_op (i), true);
}
- fprintf (f, ">\n");
+ fprintf (f, ">");
}
else if (is_a <hsa_insn_signal *> (insn))
{
@@ -804,7 +804,6 @@ dump_hsa_insn (FILE *f, hsa_insn_basic *insn, int *indent)
fprintf (f, "_%s ", hsa_type_name (mem->type));
dump_hsa_operands (f, mem);
- fprintf (f, "\n");
}
else if (is_a <hsa_insn_atomic *> (insn))
@@ -829,7 +828,6 @@ dump_hsa_insn (FILE *f, hsa_insn_basic *insn, int *indent)
fprintf (f, "_%s ", hsa_type_name (mem->type));
dump_hsa_operands (f, mem);
- fprintf (f, "\n");
}
else if (is_a <hsa_insn_mem *> (insn))
{
@@ -846,7 +844,6 @@ dump_hsa_insn (FILE *f, hsa_insn_basic *insn, int *indent)
dump_hsa_operand (f, mem->get_op (0));
fprintf (f, ", ");
dump_hsa_address (f, addr);
- fprintf (f, "\n");
}
else if (insn->opcode == BRIG_OPCODE_LDA)
{
@@ -860,7 +857,6 @@ dump_hsa_insn (FILE *f, hsa_insn_basic *insn, int *indent)
dump_hsa_operand (f, insn->get_op (0));
fprintf (f, ", ");
dump_hsa_address (f, addr);
- fprintf (f, "\n");
}
else if (is_a <hsa_insn_seg *> (insn))
{
@@ -871,7 +867,6 @@ dump_hsa_insn (FILE *f, hsa_insn_basic *insn, int *indent)
dump_hsa_reg (f, as_a <hsa_op_reg *> (seg->get_op (0)));
fprintf (f, ", ");
dump_hsa_operand (f, seg->get_op (1));
- fprintf (f, "\n");
}
else if (is_a <hsa_insn_cmp *> (insn))
{
@@ -891,7 +886,6 @@ dump_hsa_insn (FILE *f, hsa_insn_basic *insn, int *indent)
dump_hsa_operand (f, cmp->get_op (1));
fprintf (f, ", ");
dump_hsa_operand (f, cmp->get_op (2));
- fprintf (f, "\n");
}
else if (is_a <hsa_insn_br *> (insn))
{
@@ -914,7 +908,7 @@ dump_hsa_insn (FILE *f, hsa_insn_basic *insn, int *indent)
target = e->dest;
break;
}
- fprintf (f, "BB %i\n", hsa_bb_for_bb (target)->index);
+ fprintf (f, "BB %i", hsa_bb_for_bb (target)->index);
}
else if (is_a <hsa_insn_sbr *> (insn))
{
@@ -931,7 +925,7 @@ dump_hsa_insn (FILE *f, hsa_insn_basic *insn, int *indent)
fprintf (f, ", ");
}
- fprintf (f, "]\n");
+ fprintf (f, "]");
}
else if (is_a <hsa_insn_arg_block *> (insn))
{
@@ -948,7 +942,7 @@ dump_hsa_insn (FILE *f, hsa_insn_basic *insn, int *indent)
if (!start_p)
*indent -= 2;
- fprintf (f, "%c\n", c);
+ fprintf (f, "%c", c);
}
else if (is_a <hsa_insn_call *> (insn))
{
@@ -968,11 +962,12 @@ dump_hsa_insn (FILE *f, hsa_insn_basic *insn, int *indent)
if (i != call->args_symbols.length () - 1)
fprintf (f, ", ");
}
- fprintf (f, ")\n");
+ fprintf (f, ")");
}
else if (is_a <hsa_insn_comment *> (insn))
{
- fprintf (f, "%s\n", as_a <hsa_insn_comment *> (insn)->comment);
+ hsa_insn_comment *c = as_a <hsa_insn_comment *> (insn);
+ fprintf (f, "%s", c->comment);
}
else
{
@@ -1001,8 +996,19 @@ dump_hsa_insn (FILE *f, hsa_insn_basic *insn, int *indent)
else
fprintf (f, "UNKNOWN_OP_KIND");
}
- fprintf (f, "\n");
}
+
+ if (insn->brig_offset)
+ {
+ fprintf (f, " /* BRIG offset: %u", insn->brig_offset);
+
+ for (unsigned i = 0; i < insn->operand_count (); i++)
+ fprintf (f, ", op%u: %u", i, insn->get_op (i)->brig_op_offset);
+
+ fprintf (f, " */");
+ }
+
+ fprintf (f, "\n");
}
/* Dump textual representation of HSA IL in HBB to file F. */
@@ -1047,6 +1047,7 @@ hsa_insn_basic::hsa_insn_basic (unsigned nops, int opc)
bb = NULL;
number = 0;
type = BRIG_TYPE_NONE;
+ brig_offset = 0;
if (nops > 0)
operands.safe_grow_cleared (nops);
@@ -1117,6 +1118,7 @@ hsa_insn_basic::hsa_insn_basic (unsigned nops, int opc, BrigType16_t t,
prev = next = NULL;
bb = NULL;
number = 0;
+ brig_offset = 0;
if (nops > 0)
operands.safe_grow_cleared (nops);
@@ -377,6 +377,9 @@ public:
/* Type of the destination of the operations. */
BrigType16_t type;
+ /* BRIG offset of the instruction in code section. */
+ unsigned int brig_offset;
+
private:
/* Make the default constructor inaccessible. */
hsa_insn_basic () {}
--
2.5.1