Chris Lattner | 03efbe6 | 2003-01-19 18:07:38 +0000 | [diff] [blame] | 1 | #!/bin/sh |
| 2 | # |
| 3 | # Program: RunSafely.sh |
| 4 | # |
| 5 | # Synopsis: This script simply runs another program. If the program works |
| 6 | # correctly, this script has no effect, otherwise it will do things |
| 7 | # like print a stack trace of a core dump. It always returns |
| 8 | # "successful" so that tests will continue to be run. |
| 9 | # |
Chris Lattner | 75e05a9 | 2003-05-11 17:34:14 +0000 | [diff] [blame] | 10 | # This script funnels stdout and stderr from the program into the |
| 11 | # first argument specified, and outputs a <outputfile>.time file which |
| 12 | # contains a timing of the program. |
Chris Lattner | 03efbe6 | 2003-01-19 18:07:38 +0000 | [diff] [blame] | 13 | # |
Chris Lattner | b8f52ba | 2003-05-31 23:16:10 +0000 | [diff] [blame] | 14 | # Syntax: ./RunSafely.sh <ulimit> <stdinfile> <stdoutfile> <program> <args...> |
Chris Lattner | 75e05a9 | 2003-05-11 17:34:14 +0000 | [diff] [blame] | 15 | # |
Chris Lattner | 062b428 | 2003-05-17 22:32:43 +0000 | [diff] [blame] | 16 | ULIMIT=$1 |
| 17 | shift |
Chris Lattner | b8f52ba | 2003-05-31 23:16:10 +0000 | [diff] [blame] | 18 | INFILE=$1 |
| 19 | shift |
Chris Lattner | 75e05a9 | 2003-05-11 17:34:14 +0000 | [diff] [blame] | 20 | OUTFILE=$1 |
| 21 | shift |
Chris Lattner | 03efbe6 | 2003-01-19 18:07:38 +0000 | [diff] [blame] | 22 | PROGRAM=$1 |
| 23 | shift |
| 24 | |
Chris Lattner | 062b428 | 2003-05-17 22:32:43 +0000 | [diff] [blame] | 25 | ulimit -t $ULIMIT |
Chris Lattner | 75e05a9 | 2003-05-11 17:34:14 +0000 | [diff] [blame] | 26 | rm -f core core.* |
Chris Lattner | 3d28352 | 2003-05-11 18:55:29 +0000 | [diff] [blame] | 27 | ulimit -c unlimited |
Misha Brukman | e9b5cf3 | 2003-08-31 17:09:15 +0000 | [diff] [blame] | 28 | # To prevent infinite loops which fill up the disk, specify a limit on size of |
Misha Brukman | c3a8735 | 2003-08-31 17:10:55 +0000 | [diff] [blame] | 29 | # files being output by the tests. 10 MB should be enough for anybody. ;) |
| 30 | ulimit -f 10485760 |
John Criswell | 5438cb6 | 2003-07-02 20:42:05 +0000 | [diff] [blame] | 31 | |
| 32 | # |
John Criswell | c335feb | 2003-07-03 17:50:57 +0000 | [diff] [blame] | 33 | # If we are on a sun4u machine (UltraSparc), then the code we're generating |
| 34 | # is 64 bit code. In that case, use gdb-64 instead of gdb. |
| 35 | # |
| 36 | myarch=`uname -m` |
| 37 | if [ "$myarch" = "sun4u" ] |
| 38 | then |
| 39 | GDB="gdb-64" |
| 40 | else |
| 41 | GDB=gdb |
| 42 | fi |
| 43 | |
| 44 | # |
John Criswell | 5438cb6 | 2003-07-02 20:42:05 +0000 | [diff] [blame] | 45 | # Run the command, timing its execution. |
| 46 | # The standard output and standard error of $PROGRAM should go in $OUTFILE, |
| 47 | # and the standard error of time should go in $OUTFILE.time. |
| 48 | # |
| 49 | # Ah, the joys of shell programming! |
| 50 | # To get the time program and the specified program different output filenames, |
| 51 | # we tell time to launch a shell which in turn executes $PROGRAM with the |
| 52 | # necessary I/O redirection. |
| 53 | # |
John Criswell | c335feb | 2003-07-03 17:50:57 +0000 | [diff] [blame] | 54 | (time sh -c "$PROGRAM $* > $OUTFILE 2>&1 < $INFILE") > $OUTFILE.time 2>&1 |
John Criswell | 5438cb6 | 2003-07-02 20:42:05 +0000 | [diff] [blame] | 55 | |
Chris Lattner | ad1959c | 2003-07-01 18:04:43 +0000 | [diff] [blame] | 56 | if test $? -eq 0 |
| 57 | then |
| 58 | touch $OUTFILE.exitok |
| 59 | fi |
| 60 | |
Chris Lattner | 03efbe6 | 2003-01-19 18:07:38 +0000 | [diff] [blame] | 61 | if ls | egrep "^core" > /dev/null |
| 62 | then |
| 63 | corefile=`ls core* | head -1` |
| 64 | echo "where" > StackTrace.$$ |
John Criswell | c335feb | 2003-07-03 17:50:57 +0000 | [diff] [blame] | 65 | $GDB -q -batch --command=StackTrace.$$ --core=$corefile $PROGRAM < /dev/null |
Chris Lattner | 03efbe6 | 2003-01-19 18:07:38 +0000 | [diff] [blame] | 66 | rm -f StackTrace.$$ $corefile |
| 67 | fi |
| 68 | |
John Criswell | 5438cb6 | 2003-07-02 20:42:05 +0000 | [diff] [blame] | 69 | exit 0 |