Eric W. Biederman wrote:
Oh. I think I can have some answers in less than a month. That is just what I have allocated for investigation. But it will take a week or so to get something working well enough to compare with the inline tweaking approach.
Plus write now I am enjoying the change of pace.
Cool, let's see how it goes. Feed it the decode routine from nrv2b.c and see how it likes that. gcc is a long ways from doing this in registers without a major re-write, which is probably about as much work as your implementation in assy. Very clever assy code, BTW.
Also I think the .S files don't have to be kept if we use a trivial post processing program like below.
-Steve
#!/usr/bin/perl # # program to process a .s file generated by gcc # to eliminate gcc gingerbread so the file # can be used for linuxbios. # Also check for register spillage and use of the # stack since this code is intended to run without # ram. # # GPL for the linuxbios project # # by. Steve M. Gehlbach (steve @ kesa . com) #
$ret = 0; while (<STDIN>) { # # save everything and go over it # once to check for errors # $line = $_; # get everthing up to comment # we don't want to bail out on items # in comments. $_ = (split(/#/))[0]; next unless ($_); # # now check for things that indicate that # the stack is being used, which means that gcc # failed to fully inline code # with no stack pushes &Abort if /(%esp)/; if (/(%ebp)/) { &Abort unless /%esp/; } &Abort if /\scall\s/; &Abort if /.Lfe2:/; /pushl/ && ($line = '#'.$line); /pop/ && ($line = '#'.$line); /leave/ && ($line = '#'.$line); /%esp/ && ($line = '#'.$line); /ret/ && do { # only one return should be there &Abort if ($ret); # convert the last return to a jump in case # ret is in middle of code; rel jump okay? $line =~ s/ret/jmp .Lfe1/; $ret++; }; # save the processed line push @lines,$line; } # # okay so print it out # while ($_ = shift @lines) { print $_; } exit (0); # # error print it with gas pseudo-ops # and bail # sub Abort { chomp $line; print ".print "$line <<< ERROR*** gcc uses stack or failed to inline code!"\n"; print ".err\n"; exit (1); }