c6x/* "facelift":
[oweals/openssl.git] / util / fipsas.pl
1
2 # FIPS assembly language preprocessor
3 # Renames all symbols in the file to
4 # their modified fips versions.
5
6
7 my @ARGS = @ARGV;
8
9 my $top = shift @ARGS;
10 my $target = shift @ARGS;
11
12 my $runasm = 1;
13
14 if ($ARGS[0] eq "norunasm")
15         {
16         $runasm = 0;
17         shift @ARGS;
18         }
19
20 my $enabled = 0;
21
22 $enabled = 1 if $ENV{FIPSCANISTERINTERNAL} eq "y";
23
24 if ($enabled == 0 && $runasm)
25         {
26         system @ARGS;
27         exit $?
28         }
29
30
31 # Open symbol rename file.
32 open(IN, "$top/fips/fipssyms.h") || die "Can't open fipssyms.h";
33
34 # Skip to assembler symbols
35 while (<IN>)
36         {
37         last if (/assembler/)
38         }
39
40 # Store all renames [noting minimal length].
41 my $minlen=0x10000;
42 while (<IN>)
43         {
44         if (/^#define\s+_?(\w+)\s+_?(\w+)\b/)
45                 {
46                 $edits{$1} = $2;
47                 my $len = length($1);
48                 $minlen = $len if ($len<$minlen);
49                 }
50         }
51
52 open(IN,"$target") || die "Can't open $target for reading";
53
54 @code = <IN>;   # suck in whole file
55
56 close IN;
57
58 open(OUT,">$target") || die "Can't open $target for writing";
59
60 foreach $line (@code)
61         {
62         $line =~ s/\b(_?)(\w{$minlen,})\b/$1.($edits{$2} or $2)/geo;
63         print OUT $line;
64         }
65
66 close OUT;
67
68 if ($runasm)
69         {
70         # run assembler
71         system @ARGS;
72
73         my $rv = $?;
74
75         die "Error executing assembler!" if $rv != 0;
76         }