my $target_dir = $ARGV[1];
our $arch;
+our $comment_string;
our %nodes;
# include spec file
}
use strict "subs";
+my $comment_string_quoted = quotemeta($comment_string);
+
my $target_c = $target_dir."/gen_".$arch."_emitter.c";
my $target_h = $target_dir."/gen_".$arch."_emitter.h";
# skip this node description if no emit information is available
next if (!$n{"emit"} || length($n{"emit"}) < 1);
- $line = "static void emit_".$arch."_".$op."(const ir_node *n, emit_env_t *env)";
+ $line = "static void emit_".$arch."_".$op."(const ir_node *n, $arch\_emit_env_t *env)";
push(@obst_func, $line." {\n FILE *F = env->out;\n");
push(@obst_func, " char cmd_buf[256], cmnt_buf[256];\n");
push(@obst_func, " const lc_arg_env_t *arg_env = $arch\_get_arg_env();\n\n");
my $cnt = 0;
my $buf = 'cmd_buf';
- foreach $template (split(/\/\*/, $fmt, 2)) {
+ foreach $template (split(/$comment_string_quoted/, $fmt, 2)) {
my @params;
my $res = "";
$cnt++;
if ($cnt == 2) {
# add the comment begin string
- $res .= "/*";
- $buf = "cmnt_buf";
+ $res .= $comment_string;
+ $buf = "cmnt_buf";
}
# substitute all format parameter
- while ($template =~ /\%([ASD])(\d)|\%([COM])|\%(\w+)/) {
+ while ($template =~ /\%([ASDX])(\d)|\%([COM])|\%(\w+)/) {
$res .= $`; # get everything before the match
if ($1 && $1 eq "S") {
push(@params, "n");
$res .= "%".$2."D"; # substitute %Dx with %xD
}
+ elsif ($1 && $1 eq "X") {
+ push(@params, "n");
+ $res .= "%".$2."X"; # substitute %Xx with %xX
+ }
elsif ($1 && $1 eq "A") {
push(@params, "get_irn_n(n, ".($2 - 1).")");
$res .= "%+F";
$res .= "%".$3;
}
elsif ($4) { # backend provided function to call, has to return a string
- push(@params, $4."(n)");
+ push(@params, $4."(n, env)");
$res .= "\%s";
}
}
}
- push(@obst_func, ' lc_efprintf(arg_env, F, "\t%-35s %-60s /* %+F */\n", cmd_buf, cmnt_buf, n);'."\n");
+ push(@obst_func, ' lc_efprintf(arg_env, F, "\t%-35s %-60s /* %+F (%+G) */\n", cmd_buf, cmnt_buf, n, n);'."\n");
push(@obst_func, "}\n\n");
}