| #!/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 beginnign 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"); | |
| # validate output. | |
| system("FileCheck", "-input-file", "$output_file", "$testcase_file"); | |
| if ($?>>8 == 1) { | |
| exit 1; | |
| } | |
| else { | |
| exit 0; | |
| } |