blob: d094799131609bf26bd02111903a1591e6734035 [file] [log] [blame]
#!/usr/bin/perl -w
# Copyright 2017 The Clspv Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Convert a SPIR-V assembly listing into a list of FileCheck check assertions.
use strict;
use Getopt::Long;
# Only replace numeric IDs?
my $numeric_only = 0;
# Can we assume RE2 is the matcher? It supports more readable expressions.
my $assume_re2 = 0;
GetOptions("numeric" => \$numeric_only,
"re2" => \$assume_re2,
) or die ("Bad option");
# Key is a defined id.
my %id = ();
my $replace_pat = $numeric_only ? '\d+' : '\S+';
my $id_pat = $assume_re2 ? '\w+' : '[0-9a-zA-Z_]+';
while(<>) {
chomp;
my $line = $_;
$line =~ s/^\s+//;
$line =~ s/\s+$//;
my $is_type_or_constant = 0;
my @words = split(/\s+/, $line);
my @parts = ();
foreach my $word (@words) {
if ($word =~ m/^(OpType|OpConstant)/) {
$is_type_or_constant = 1;
}
if ($word =~ m/^%($replace_pat)/o) {
my $name = $1;
if (defined $id{$name}) {
# This is a use, not the first mention.
push @parts, "[[_$name]]";
} else {
# This is first use of the pattern, and therefore a definition.
# Write a match rule.
push @parts, "[[_$name:%$id_pat]]";
# Also remember that we made this defnition.
$id{$name} = 1;
}
} else {
# Not an Id. Emit it verbatim
push @parts, $word;
}
}
$is_type_or_constant = 0;
my $first = ($is_type_or_constant ? '// CHECK-DAG: ' : '// CHECK: ');
print join(' ', $first, @parts), "\n";
}