1#!/usr/bin/env perl 2# 3# This script tests debugging information generated by a compiler. 4# Input arguments 5# - Input source program. Usually this source file is decorated using 6# special comments to communicate debugger commands. 7# - Executable file. This file is generated by the compiler. 8# 9# This perl script extracts debugger commands from input source program 10# comments in a script. A debugger is used to load the executable file 11# and run the script generated from source program comments. Finally, 12# the debugger output is checked, using FileCheck, to validate 13# debugging information. 14# 15# On Darwin the default is to use the llgdb.py wrapper script which 16# translates gdb commands into their lldb equivalents. 17 18use File::Basename; 19use Config; 20use Cwd; 21 22my $testcase_file = $ARGV[0]; 23my $executable_file = $ARGV[1]; 24 25my $input_filename = basename $testcase_file; 26my $output_dir = dirname $executable_file; 27 28my $debugger_script_file = "$output_dir/$input_filename.debugger.script"; 29my $output_file = "$output_dir/$input_filename.gdb.output"; 30 31my %cmd_map = (); 32# Assume lldb to be the debugger on Darwin. 33my $use_lldb = 0; 34$use_lldb = 1 if ($Config{osname} eq "darwin"); 35 36# Extract debugger commands from testcase. They are marked with DEBUGGER: 37# at the beginning of a comment line. 38open(INPUT, $testcase_file); 39open(OUTPUT, ">$debugger_script_file"); 40while(<INPUT>) { 41 my($line) = $_; 42 $i = index($line, "DEBUGGER:"); 43 if ( $i >= 0) { 44 $l = length("DEBUGGER:"); 45 $s = substr($line, $i + $l); 46 print OUTPUT "$s"; 47 } 48} 49print OUTPUT "\n"; 50print OUTPUT "quit\n"; 51close(INPUT); 52close(OUTPUT); 53 54# setup debugger and debugger options to run a script. 55my $my_debugger = $ENV{'DEBUGGER'}; 56if (!$my_debugger) { 57 if ($use_lldb) { 58 my $path = dirname(Cwd::abs_path($0)); 59 $my_debugger = "/usr/bin/xcrun python3 $path/llgdb.py"; 60 } else { 61 $my_debugger = "gdb"; 62 } 63} 64 65# quiet / exit after cmdline / no init file / execute script 66my $debugger_options = "-q -batch -n -x"; 67 68# run debugger and capture output. 69print("Running debugger\n"); 70system("$my_debugger $debugger_options $debugger_script_file $executable_file > $output_file 2>&1"); 71if ($?) { 72 print("Debugger output was:\n"); 73 system("cat", "$output_file"); 74 exit 1; 75} 76# validate output. 77print("Running FileCheck\n"); 78system("FileCheck", "-input-file", "$output_file", "$testcase_file"); 79if ($?) { 80 print("Debugger output was:\n"); 81 system("cat", "$output_file"); 82 exit 1; 83} 84else { 85 exit 0; 86} 87