Commit | Line | Data |
---|---|---|
ea65fe05 DE |
1 | #! /bin/sh |
2 | # Wrapper around gcc to add the .gdb_index section when running the testsuite. | |
3 | ||
0b302171 | 4 | # Copyright (C) 2010-2012 Free Software Foundation, Inc. |
ea65fe05 DE |
5 | # This program is free software; you can redistribute it and/or modify |
6 | # it under the terms of the GNU General Public License as published by | |
7 | # the Free Software Foundation; either version 3 of the License, or | |
8 | # (at your option) any later version. | |
9 | # | |
10 | # This program is distributed in the hope that it will be useful, | |
11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 | # GNU General Public License for more details. | |
14 | # | |
15 | # You should have received a copy of the GNU General Public License | |
16 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
17 | ||
18 | # This program requires gdb and objcopy in addition to gcc. | |
0b5574da DE |
19 | # The default values are gdb from the build tree and objcopy from $PATH. |
20 | # They may be overridden by setting environment variables GDB and OBJCOPY | |
ea65fe05 DE |
21 | # respectively. |
22 | # We assume the current directory is either $obj/gdb or $obj/gdb/testsuite. | |
23 | # | |
24 | # Example usage: | |
25 | # | |
26 | # bash$ cd $objdir/gdb/testsuite | |
27 | # bash$ runtest \ | |
28 | # CC_FOR_TARGET="/bin/sh $srcdir/cc-with-index.sh gcc" \ | |
29 | # CXX_FOR_TARGET="/bin/sh $srcdir/cc-with-index.sh g++" | |
30 | # | |
31 | # For documentation on index files: info -f gdb.info -n "Index Files" | |
32 | ||
33 | myname=cc-with-index.sh | |
34 | ||
35 | if [ -z "$GDB" ] | |
36 | then | |
37 | if [ -f ./gdb ] | |
38 | then | |
39 | GDB="./gdb" | |
40 | elif [ -f ../gdb ] | |
41 | then | |
42 | GDB="../gdb" | |
b8e9bd6c DE |
43 | elif [ -f ../../gdb ] |
44 | then | |
45 | GDB="../../gdb" | |
ea65fe05 DE |
46 | else |
47 | echo "$myname: unable to find usable gdb" >&2 | |
48 | exit 1 | |
49 | fi | |
50 | fi | |
51 | ||
52 | OBJCOPY=${OBJCOPY:-objcopy} | |
53 | ||
54 | have_link=unknown | |
55 | next_is_output_file=no | |
00e14314 | 56 | output_file=a.out |
ea65fe05 DE |
57 | |
58 | for arg in "$@" | |
59 | do | |
60 | if [ "$next_is_output_file" = "yes" ] | |
61 | then | |
62 | output_file="$arg" | |
63 | next_is_output_file=no | |
64 | continue | |
65 | fi | |
66 | ||
67 | # Poor man's gcc argument parser. | |
68 | # We don't need to handle all arguments, we just need to know if we're | |
69 | # doing a link and what the output file is. | |
70 | # It's not perfect, but it seems to work well enough for the task at hand. | |
71 | case "$arg" in | |
72 | "-c") have_link=no ;; | |
73 | "-E") have_link=no ;; | |
74 | "-S") have_link=no ;; | |
75 | "-o") next_is_output_file=yes ;; | |
76 | esac | |
77 | done | |
78 | ||
79 | if [ "$next_is_output_file" = "yes" ] | |
80 | then | |
81 | echo "$myname: Unable to find output file" >&2 | |
82 | exit 1 | |
83 | fi | |
84 | ||
85 | if [ "$have_link" = "no" ] | |
86 | then | |
87 | "$@" | |
88 | exit $? | |
89 | fi | |
90 | ||
91 | index_file="${output_file}.gdb-index" | |
92 | if [ -f "$index_file" ] | |
93 | then | |
94 | echo "$myname: Index file $index_file exists, won't clobber." >&2 | |
95 | exit 1 | |
96 | fi | |
97 | ||
98 | output_dir="${output_file%/*}" | |
99 | [ "$output_dir" = "$output_file" ] && output_dir="." | |
100 | ||
101 | "$@" | |
102 | rc=$? | |
103 | [ $rc != 0 ] && exit $rc | |
104 | if [ ! -f "$output_file" ] | |
105 | then | |
106 | echo "$myname: Internal error: $output_file missing." >&2 | |
107 | exit 1 | |
108 | fi | |
109 | ||
8d6e0714 | 110 | $GDB --batch-silent -nx -ex "set auto-load no" -ex "file $output_file" -ex "save gdb-index $output_dir" |
ea65fe05 DE |
111 | rc=$? |
112 | [ $rc != 0 ] && exit $rc | |
113 | ||
114 | # GDB might not always create an index. Cope. | |
115 | if [ -f "$index_file" ] | |
116 | then | |
117 | $OBJCOPY --add-section .gdb_index="$index_file" \ | |
118 | --set-section-flags .gdb_index=readonly \ | |
119 | "$output_file" "$output_file" | |
120 | rc=$? | |
121 | else | |
122 | rc=0 | |
123 | fi | |
124 | ||
125 | rm -f "$index_file" | |
126 | exit $rc |