#!/usr/bin/perl #===-- test_bcc_debuginfo.pl - Debugger integration test driver script ---===# # # The LLVM Compiler Infrastructure # # This file is distributed under the University of Illinois Open Source # License. See LICENSE.TXT for details. # #===----------------------------------------------------------------------===# # # This script tests debugging information generated by a compiler. # Input arguments # - Path to FileCheck tool. # - Input source program. Usually this source file is decorated using # special comments (//DEBUGGER:, //CHECK:)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 $filecheck_tool = $ARGV[0]; my $testcase_file = $ARGV[1]; my $testcase_output = $ARGV[2]; my $input_filename = basename $testcase_file; my $output_dir = dirname $testcase_output; my $debugger_script_file = "$output_dir/$input_filename.debugger.script"; my $output_file = "$output_dir/$input_filename.gdb.output"; open(OUTPUT, ">$debugger_script_file"); # Enable extra verbosity in GDB print OUTPUT "set verbose on\n"; # Extract debugger commands from testcase. They are marked with DEBUGGER: # at the beginning of a comment line. open(INPUT, $testcase_file); while(<INPUT>) { my($line) = $_; $i = index($line, "DEBUGGER:"); if ( $i >= 0) { $l = length("DEBUGGER:"); $s = substr($line, $i + $l); $s =~ s/\%s/$input_filename/g; $s =~ s/\%t/$testcase_output/g; print OUTPUT "$s"; } } print OUTPUT "\n"; print OUTPUT "quit\n"; close(INPUT); close(OUTPUT); # setup debugger and debugger options to run a script. my $debugger = $ENV{'DEBUGGER'}; my $debugger_options = $ENV{'DEBUGGER_ARGS'}; if (!$debugger) { print "Please set DEBUGGER prior to using this script"; exit 1; } $debugger_options = "-x $debugger_script_file $debugger_options $testcase_output"; # run debugger and capture output. system("$debugger $debugger_options > $output_file 2>&1") ; if ($?>>8 != 0) { print "Error during debugger invocation. Command used was: \n"; print("$debugger $debugger_options > $output_file 2>&1\n") ; exit 1; } # validate output. system("$filecheck_tool", "-input-file", "$output_file", "$testcase_file"); if ($?>>8 != 0) { print "Error during verification. Debugger command used was: \n"; print("$debugger $debugger_options > $output_file 2>&1\n") ; print "Verification command used was: \n"; print "$filecheck_tool -input-file $output_file $testcase_file\n"; exit 1; } else { exit 0; }