| #!/usr/bin/perl |
| # |
| # This script tests debugging information generated by a compiler. |
| # Input arguments |
| # - Input source program. Usually this source file is decorated using |
| # special comments to communicate debugger commands. |
| # - Executable file. This file is generated by the compiler. |
| # |
| # This perl script extracts debugger commands from input source program |
| # comments in a script. A debugger is used to load the executable file |
| # and run the script generated from source program comments. Finally, |
| # the debugger output is checked, using FileCheck, to validate |
| # debugging information. |
| |
| use File::Basename; |
| |
| my $testcase_file = $ARGV[0]; |
| my $executable_file = $ARGV[1]; |
| |
| my $input_filename = basename $testcase_file; |
| my $output_dir = dirname $executable_file; |
| |
| my $debugger_script_file = "$output_dir/$input_filename.debugger.script"; |
| my $output_file = "$output_dir/$input_filename.gdb.output"; |
| |
| # Extract debugger commands from testcase. They are marked with DEBUGGER: |
| # at the beginning of a comment line. |
| open(INPUT, $testcase_file); |
| open(OUTPUT, ">$debugger_script_file"); |
| while(<INPUT>) { |
| my($line) = $_; |
| $i = index($line, "DEBUGGER:"); |
| if ( $i >= 0) { |
| $l = length("DEBUGGER:"); |
| $s = substr($line, $i + $l); |
| print OUTPUT "$s"; |
| } |
| } |
| print OUTPUT "\n"; |
| print OUTPUT "quit\n"; |
| close(INPUT); |
| close(OUTPUT); |
| |
| # setup debugger and debugger options to run a script. |
| my $my_debugger = $ENV{'DEBUGGER'}; |
| if (!$my_debugger) { |
| $my_debugger = "gdb"; |
| } |
| my $debugger_options = "-q -batch -n -x"; |
| |
| # run debugger and capture output. |
| system("$my_debugger $debugger_options $debugger_script_file $executable_file > $output_file 2>&1"); |
| |
| # validate output. |
| system("FileCheck", "-input-file", "$output_file", "$testcase_file"); |
| if ($?>>8 == 1) { |
| exit 1; |
| } |
| else { |
| exit 0; |
| } |