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