X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fgenmdesc.pl;h=ae49ecba9f28685169c6ef23c42d422e5898a540;hb=f98d0799d89401853f59e4427764932d633b8935;hp=2ced2e71640a0f5dbc3687774786664f44fca98a;hpb=e96b1271fd0f67dc198a28378f433a9c318640f4;p=mono.git diff --git a/mono/mini/genmdesc.pl b/mono/mini/genmdesc.pl old mode 100644 new mode 100755 index 2ced2e71640..ae49ecba9f2 --- a/mono/mini/genmdesc.pl +++ b/mono/mini/genmdesc.pl @@ -6,22 +6,59 @@ use strict; no locale; # must keep in sync with mini.h -my @spec_names = qw(dest src1 src2 src3 len clob); +my @spec_names = qw(dest src1 src2 src3 len clob nacl); sub INST_DEST () {return 0;} sub INST_SRC1 () {return 1;} sub INST_SRC2 () {return 2;} sub INST_SRC3 () {return 3;} sub INST_LEN () {return 4;} sub INST_CLOB () {return 5;} +# making INST_NACL the same as INST_MAX is not a mistake, +# INST_NACL writes over INST_LEN, it's not its own field +sub INST_NACL () {return 6;} sub INST_MAX () {return 6;} # this must include all the #defines used in mini-ops.h my @defines = qw (__i386__ __x86_64__ __ppc__ __powerpc__ __ppc64__ __arm__ - __sparc__ sparc __s390__ s390 __ia64__ __alpha__ __mips__); + __sparc__ sparc __s390__ s390 __alpha__ __mips__ __aarch64__ __wasm__); my %table =(); my %template_table =(); my @opcodes = (); +my $nacl = 0; + +sub parse_file +{ + my ($define, $file) = @_; + my @enabled = (1); + my $i = 0; + open (OPS, $file) || die "Cannot open $file: $!"; + while () { + if (/^\s*#\s*if\s+(.*)/) { + my $defines = $1; + die "fix the genmdesc.pl cpp parser to handle all operators" if /(&&)|([!<>=])/; + unshift @enabled, scalar ($defines =~ /defined\s*\(\s*$define\s*\)/); + next; + } + if (/^\s*#\s*ifdef\s+(\S+)/) { + my $defines = $1; + unshift @enabled, $defines eq $define; + next; + } + if (/^\s*#\s*endif/) { + shift @enabled; + next; + } + next unless $enabled [0]; + next unless /MINI_OP3?\s*\(\s*(\S+?)\s*,\s*"(.*?)"/; + my ($sym, $name) = ($1, $2); + push @opcodes, [$sym, $name]; + $table{$name} = {num => $i, name => $name}; + $i++; + } + close (OPS); +} + sub load_opcodes { my ($srcdir, $arch) = @_; @@ -42,13 +79,20 @@ sub load_opcodes if ($arch =~ "__i386__") { $arch_define = "TARGET_X86"; } - if ($arch =~ " __x86_64__") { + if ($arch =~ "__x86_64__") { $arch_define = "TARGET_AMD64"; } if ($arch =~ "__arm__") { $arch_define = "TARGET_ARM"; } - + if ($arch =~ "__aarch64__") { + $arch_define = "TARGET_ARM64"; + } + if ($arch =~ "__wasm__") { + $arch_define = "TARGET_WASM"; + } + parse_file ($arch_define, "$srcdir/mini-ops.h"); + return; $cpp .= " -D$arch_define $srcdir/mini-ops.h|"; #print "Running: $cpp\n"; open (OPS, $cpp) || die "Cannot execute cpp: $!"; @@ -130,10 +174,19 @@ sub build_spec { } #print "vals: " . join (' ', @vals) . "\n"; my $res = ""; + my $n = 0; for (my $i = 0; $i < @vals; ++$i) { + next if $i == INST_NACL; if (defined $vals [$i]) { if ($i == INST_LEN) { - $res .= sprintf ("\\x%x\" \"", +$vals [$i]); + $n = $vals [$i]; + if ($n =~ /[^0-9]/) { + die "Invalid instruction length $n\n"; + } + if ((defined $vals [INST_NACL]) and $nacl == 1){ + $n = $vals [INST_NACL]; + } + $res .= sprintf ("\\x%x\" \"", + $n); } else { if ($vals [$i] =~ /^[a-zA-Z0-9]$/) { $res .= $vals [$i]; @@ -152,11 +205,11 @@ sub build_table { my ($fname, $name) = @_; my $i; my $idx; - my $idx_array = "const guint16 ${name}_idx [] = {\n"; + my $idx_array = "const guint16 mono_${name}_idx [] = {\n"; open (OUT, ">$fname") || die "Cannot open file $fname: $!"; print OUT "/* File automatically generated by genmdesc, don't change */\n\n"; - print OUT "const char $name [] = {\n"; + print OUT "const char mono_$name [] = {\n"; print OUT "\t\"" . ("\\x0" x INST_MAX) . "\"\t/* null entry */\n"; $idx = 1; @@ -181,12 +234,17 @@ sub build_table { } sub usage { - die "genmdesc.pl arch srcdir output name desc [desc2 ...]\n"; + die "genmdesc.pl arch srcdir [--nacl] output name desc [desc2 ...]\n"; } my $arch = shift || usage (); my $srcdir = shift || usage (); my $output = shift || usage (); +if ($output eq "--nacl") +{ + $nacl = 1; + $output = shift || usage(); +} my $name = shift || usage (); usage () unless @ARGV; my @files = @ARGV;