Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(365)

Side by Side Diff: gdb/python/py-auto-load.c

Issue 11969036: Merge GDB 7.5.1 (Closed) Base URL: http://git.chromium.org/native_client/nacl-gdb.git@master
Patch Set: Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « gdb/python/lib/gdb/types.py ('k') | gdb/python/py-block.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
None
OLDNEW
1 /* GDB routines for supporting auto-loaded scripts. 1 /* GDB routines for supporting auto-loaded scripts.
2 2
3 Copyright (C) 2010-2012 Free Software Foundation, Inc. 3 Copyright (C) 2010-2012 Free Software Foundation, Inc.
4 4
5 This file is part of GDB. 5 This file is part of GDB.
6 6
7 This program is free software; you can redistribute it and/or modify 7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by 8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or 9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version. 10 (at your option) any later version.
11 11
12 This program is distributed in the hope that it will be useful, 12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details. 15 GNU General Public License for more details.
16 16
17 You should have received a copy of the GNU General Public License 17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
19 19
20 #include "defs.h" 20 #include "defs.h"
21 #include "filenames.h"
22 #include "gdb_string.h" 21 #include "gdb_string.h"
23 #include "gdb_regex.h"
24 #include "top.h" 22 #include "top.h"
25 #include "exceptions.h" 23 #include "exceptions.h"
26 #include "command.h"
27 #include "gdbcmd.h" 24 #include "gdbcmd.h"
28 #include "observer.h"
29 #include "progspace.h"
30 #include "objfiles.h" 25 #include "objfiles.h"
31 #include "python.h" 26 #include "python.h"
32 #include "cli/cli-cmds.h" 27 #include "cli/cli-cmds.h"
33 28 #include "auto-load.h"
34 /* Internal-use flag to enable/disable auto-loading.
35 This is true if we should auto-load python code when an objfile is opened,
36 false otherwise.
37
38 Both auto_load_scripts && gdbpy_global_auto_load must be true to enable
39 auto-loading.
40
41 This flag exists to facilitate deferring auto-loading during start-up
42 until after ./.gdbinit has been read; it may augment the search directories
43 used to find the scripts. */
44 int gdbpy_global_auto_load = 1;
45 29
46 #ifdef HAVE_PYTHON 30 #ifdef HAVE_PYTHON
47 31
48 #include "python-internal.h" 32 #include "python-internal.h"
49 33
50 /* NOTE: It's trivial to also support auto-loading normal gdb scripts. 34 /* The section to look for Python auto-loaded scripts (in file formats that
51 There has yet to be a need so it's not implemented. */ 35 support sections).
52
53 /* The suffix of per-objfile scripts to auto-load.
54 E.g. When the program loads libfoo.so, look for libfoo-gdb.py. */
55 #define GDBPY_AUTO_FILE_NAME "-gdb.py"
56
57 /* The section to look for scripts (in file formats that support sections).
58 Each entry in this section is a byte of value 1, and then the nul-terminated 36 Each entry in this section is a byte of value 1, and then the nul-terminated
59 name of the script. The script name may include a directory. 37 name of the script. The script name may include a directory.
60 The leading byte is to allow upward compatible extensions. */ 38 The leading byte is to allow upward compatible extensions. */
61 #define GDBPY_AUTO_SECTION_NAME ".debug_gdb_scripts" 39 #define GDBPY_AUTO_SECTION_NAME ".debug_gdb_scripts"
62 40
63 /* For scripts specified in .debug_gdb_scripts, multiple objfiles may load 41 /* User-settable option to enable/disable auto-loading of Python scripts:
64 the same script. There's no point in loading the script multiple times, 42 set auto-load python-scripts on|off
65 and there can be a lot of objfiles and scripts, so we keep track of scripts 43 This is true if we should auto-load associated Python scripts when an
66 loaded this way. */ 44 objfile is opened, false otherwise. */
45 static int auto_load_python_scripts = 1;
67 46
68 struct auto_load_pspace_info 47 static void gdbpy_load_auto_script_for_objfile (struct objfile *objfile,
69 { 48 » » » » » » FILE *file,
70 /* For each program space we keep track of loaded scripts. */ 49 » » » » » » const char *filename);
71 struct htab *loaded_scripts;
72 50
73 /* Non-zero if we've issued the warning about an auto-load script not being 51 /* "show" command for the auto_load_python_scripts configuration variable. */
74 found. We only want to issue this warning once. */
75 int script_not_found_warning_printed;
76 };
77
78 /* Objects of this type are stored in the loaded script hash table. */
79
80 struct loaded_script
81 {
82 /* Name as provided by the objfile. */
83 const char *name;
84 /* Full path name or NULL if script wasn't found (or was otherwise
85 inaccessible). */
86 const char *full_path;
87 };
88
89 /* User-settable option to enable/disable auto-loading:
90 set auto-load-scripts on|off
91 This is true if we should auto-load associated scripts when an objfile
92 is opened, false otherwise.
93 At the moment, this only affects python scripts, but there's no reason
94 one couldn't also have other kinds of auto-loaded scripts, and there's
95 no reason to have them each controlled by a separate flag.
96 So we elide "python" from the name here and in the option.
97 The fact that it lives here is just an implementation detail. */
98 static int auto_load_scripts = 1;
99
100 /* Per-program-space data key. */
101 static const struct program_space_data *auto_load_pspace_data;
102 52
103 static void 53 static void
104 auto_load_pspace_data_cleanup (struct program_space *pspace, void *arg) 54 show_auto_load_python_scripts (struct ui_file *file, int from_tty,
55 » » » struct cmd_list_element *c, const char *value)
105 { 56 {
106 struct auto_load_pspace_info *info; 57 fprintf_filtered (file, _("Auto-loading of Python scripts is %s.\n"), value);
107
108 info = program_space_data (pspace, auto_load_pspace_data);
109 if (info != NULL)
110 {
111 if (info->loaded_scripts)
112 » htab_delete (info->loaded_scripts);
113 xfree (info);
114 }
115 } 58 }
116 59
117 /* Get the current autoload data. If none is found yet, add it now. This 60 /* Definition of script language for Python scripts. */
118 function always returns a valid object. */
119 61
120 static struct auto_load_pspace_info * 62 static const struct script_language script_language_python
121 get_auto_load_pspace_data (struct program_space *pspace) 63 = { GDBPY_AUTO_FILE_NAME, gdbpy_load_auto_script_for_objfile };
122 {
123 struct auto_load_pspace_info *info;
124 64
125 info = program_space_data (pspace, auto_load_pspace_data); 65 /* Wrapper of source_python_script_for_objfile for script_language_python. */
126 if (info == NULL)
127 {
128 info = XZALLOC (struct auto_load_pspace_info);
129 set_program_space_data (pspace, auto_load_pspace_data, info);
130 }
131
132 return info;
133 }
134
135 /* Hash function for the loaded script hash. */
136
137 static hashval_t
138 hash_loaded_script_entry (const void *data)
139 {
140 const struct loaded_script *e = data;
141
142 return htab_hash_string (e->name);
143 }
144
145 /* Equality function for the loaded script hash. */
146
147 static int
148 eq_loaded_script_entry (const void *a, const void *b)
149 {
150 const struct loaded_script *ea = a;
151 const struct loaded_script *eb = b;
152
153 return strcmp (ea->name, eb->name) == 0;
154 }
155
156 /* Initialize the table to track loaded scripts.
157 Each entry is hashed by the full path name. */
158 66
159 static void 67 static void
160 init_loaded_scripts_info (struct auto_load_pspace_info *pspace_info) 68 gdbpy_load_auto_script_for_objfile (struct objfile *objfile, FILE *file,
69 » » » » const char *filename)
161 { 70 {
162 /* Choose 31 as the starting size of the hash table, somewhat arbitrarily. 71 int is_safe;
163 Space for each entry is obtained with one malloc so we can free them 72 struct auto_load_pspace_info *pspace_info;
164 easily. */
165 73
166 pspace_info->loaded_scripts = htab_create (31, 74 is_safe = file_is_auto_load_safe (filename,
167 » » » » » hash_loaded_script_entry, 75 » » » » _("auto-load: Loading Python script \"%s\" "
168 » » » » » eq_loaded_script_entry, 76 » » » » "by extension for objfile \"%s\".\n"),
169 » » » » » xfree); 77 » » » » filename, objfile->name);
170 78
171 pspace_info->script_not_found_warning_printed = FALSE; 79 /* Add this script to the hash table too so "info auto-load python-scripts"
172 } 80 can print it. */
81 pspace_info = get_auto_load_pspace_data_for_loading (current_program_space);
82 maybe_add_script (pspace_info, is_safe, filename, filename,
83 » » &script_language_python);
173 84
174 /* Wrapper on get_auto_load_pspace_data to also allocate the hash table 85 if (is_safe)
175 for loading scripts. */ 86 source_python_script_for_objfile (objfile, file, filename);
176
177 static struct auto_load_pspace_info *
178 get_auto_load_pspace_data_for_loading (struct program_space *pspace)
179 {
180 struct auto_load_pspace_info *info;
181
182 info = get_auto_load_pspace_data (pspace);
183 if (info->loaded_scripts == NULL)
184 init_loaded_scripts_info (info);
185
186 return info;
187 }
188
189 /* Add script NAME to hash table HTAB.
190 FULL_PATH is NULL if the script wasn't found.
191 The result is true if the script was already in the hash table. */
192
193 static int
194 maybe_add_script (struct htab *htab, const char *name, const char *full_path)
195 {
196 struct loaded_script **slot, entry;
197 int in_hash_table;
198
199 entry.name = name;
200 entry.full_path = full_path;
201 slot = (struct loaded_script **) htab_find_slot (htab, &entry, INSERT);
202 in_hash_table = *slot != NULL;
203
204 /* If this script is not in the hash table, add it. */
205
206 if (! in_hash_table)
207 {
208 char *p;
209
210 /* Allocate all space in one chunk so it's easier to free. */
211 *slot = xmalloc (sizeof (**slot)
212 » » + strlen (name) + 1
213 » » + (full_path != NULL ? (strlen (full_path) + 1) : 0));
214 p = ((char*) *slot) + sizeof (**slot);
215 strcpy (p, name);
216 (*slot)->name = p;
217 if (full_path != NULL)
218 » {
219 » p += strlen (p) + 1;
220 » strcpy (p, full_path);
221 » (*slot)->full_path = p;
222 » }
223 else
224 » (*slot)->full_path = NULL;
225 }
226
227 return in_hash_table;
228 } 87 }
229 88
230 /* Load scripts specified in OBJFILE. 89 /* Load scripts specified in OBJFILE.
231 START,END delimit a buffer containing a list of nul-terminated 90 START,END delimit a buffer containing a list of nul-terminated
232 file names. 91 file names.
233 SOURCE_NAME is used in error messages. 92 SOURCE_NAME is used in error messages.
234 93
235 Scripts are found per normal "source -s" command processing. 94 Scripts are found per normal "source -s" command processing.
236 First the script is looked for in $cwd. If not found there the 95 First the script is looked for in $cwd. If not found there the
237 source search path is used. 96 source search path is used.
238 97
239 The section contains a list of path names of files containing 98 The section contains a list of path names of files containing
240 python code to load. Each path is null-terminated. */ 99 python code to load. Each path is null-terminated. */
241 100
242 static void 101 static void
243 source_section_scripts (struct objfile *objfile, const char *source_name, 102 source_section_scripts (struct objfile *objfile, const char *source_name,
244 const char *start, const char *end) 103 const char *start, const char *end)
245 { 104 {
246 const char *p; 105 const char *p;
247 struct auto_load_pspace_info *pspace_info; 106 struct auto_load_pspace_info *pspace_info;
248 107
249 pspace_info = get_auto_load_pspace_data_for_loading (current_program_space); 108 pspace_info = get_auto_load_pspace_data_for_loading (current_program_space);
250 109
251 for (p = start; p < end; ++p) 110 for (p = start; p < end; ++p)
252 { 111 {
253 const char *file; 112 const char *file;
254 FILE *stream; 113 FILE *stream;
255 char *full_path; 114 char *full_path;
256 int opened, in_hash_table; 115 int opened, in_hash_table;
116 struct cleanup *back_to;
257 117
258 if (*p != 1) 118 if (*p != 1)
259 { 119 {
260 warning (_("Invalid entry in %s section"), GDBPY_AUTO_SECTION_NAME); 120 warning (_("Invalid entry in %s section"), GDBPY_AUTO_SECTION_NAME);
261 /* We could try various heuristics to find the next valid entry, 121 /* We could try various heuristics to find the next valid entry,
262 but it's safer to just punt. */ 122 but it's safer to just punt. */
263 break; 123 break;
264 } 124 }
265 file = ++p; 125 file = ++p;
266 126
(...skipping 12 matching lines...) Expand all
279 } 139 }
280 if (p == file) 140 if (p == file)
281 { 141 {
282 warning (_("Empty path in %s"), source_name); 142 warning (_("Empty path in %s"), source_name);
283 continue; 143 continue;
284 } 144 }
285 145
286 opened = find_and_open_script (file, 1 /*search_path*/, 146 opened = find_and_open_script (file, 1 /*search_path*/,
287 &stream, &full_path); 147 &stream, &full_path);
288 148
149 back_to = make_cleanup (null_cleanup, NULL);
150 if (opened)
151 {
152 make_cleanup_fclose (stream);
153 make_cleanup (xfree, full_path);
154
155 if (!file_is_auto_load_safe (full_path,
156 _("auto-load: Loading Python script "
157 "\"%s\" from section \"%s\" of "
158 "objfile \"%s\".\n"),
159 full_path, GDBPY_AUTO_SECTION_NAME,
160 objfile->name))
161 opened = 0;
162 }
163 else
164 {
165 full_path = NULL;
166
167 /* We don't throw an error, the program is still debuggable. */
168 if (script_not_found_warning_print (pspace_info))
169 warning (_("Missing auto-load scripts referenced in section %s\n\
170 of file %s\n\
171 Use `info auto-load python [REGEXP]' to list them."),
172 GDBPY_AUTO_SECTION_NAME, objfile->name);
173 }
174
289 /* If one script isn't found it's not uncommon for more to not be 175 /* If one script isn't found it's not uncommon for more to not be
290 found either. We don't want to print an error message for each 176 found either. We don't want to print an error message for each
291 script, too much noise. Instead, we print the warning once and tell 177 script, too much noise. Instead, we print the warning once and tell
292 the user how to find the list of scripts that weren't loaded. 178 the user how to find the list of scripts that weren't loaded.
293 179
294 IWBN if complaints.c were more general-purpose. */ 180 IWBN if complaints.c were more general-purpose. */
295 181
296 in_hash_table = maybe_add_script (pspace_info->loaded_scripts, file, 182 in_hash_table = maybe_add_script (pspace_info, opened, file, full_path,
297 » » » » » opened ? full_path : NULL); 183 » » » » » &script_language_python);
298 184
299 if (! opened) 185 /* If this file is not currently loaded, load it. */
300 » { 186 if (opened && !in_hash_table)
301 » /* We don't throw an error, the program is still debuggable. */ 187 » source_python_script_for_objfile (objfile, stream, full_path);
302 » if (! pspace_info->script_not_found_warning_printed) 188
303 » { 189 do_cleanups (back_to);
304 » warning (_("Missing auto-load scripts referenced in section %s\n\
305 of file %s\n\
306 Use `info auto-load-scripts [REGEXP]' to list them."),
307 » » GDBPY_AUTO_SECTION_NAME, objfile->name);
308 » pspace_info->script_not_found_warning_printed = TRUE;
309 » }
310 » }
311 else
312 » {
313 » /* If this file is not currently loaded, load it. */
314 » if (! in_hash_table)
315 » source_python_script_for_objfile (objfile, full_path);
316 » fclose (stream);
317 » xfree (full_path);
318 » }
319 } 190 }
320 } 191 }
321 192
322 /* Load scripts specified in section SECTION_NAME of OBJFILE. */ 193 /* Load scripts specified in section SECTION_NAME of OBJFILE. */
323 194
324 static void 195 static void
325 auto_load_section_scripts (struct objfile *objfile, const char *section_name) 196 auto_load_section_scripts (struct objfile *objfile, const char *section_name)
326 { 197 {
327 bfd *abfd = objfile->obfd; 198 bfd *abfd = objfile->obfd;
328 asection *scripts_sect; 199 asection *scripts_sect;
329 bfd_size_type size; 200 bfd_size_type size;
330 char *p; 201 char *p;
331 struct cleanup *cleanups; 202 struct cleanup *cleanups;
332 203
333 scripts_sect = bfd_get_section_by_name (abfd, section_name); 204 scripts_sect = bfd_get_section_by_name (abfd, section_name);
334 if (scripts_sect == NULL) 205 if (scripts_sect == NULL)
335 return; 206 return;
336 207
337 size = bfd_get_section_size (scripts_sect); 208 size = bfd_get_section_size (scripts_sect);
338 p = xmalloc (size); 209 p = xmalloc (size);
339 210
340 cleanups = make_cleanup (xfree, p); 211 cleanups = make_cleanup (xfree, p);
341 212
342 if (bfd_get_section_contents (abfd, scripts_sect, p, (file_ptr) 0, size)) 213 if (bfd_get_section_contents (abfd, scripts_sect, p, (file_ptr) 0, size))
343 source_section_scripts (objfile, section_name, p, p + size); 214 source_section_scripts (objfile, section_name, p, p + size);
344 else 215 else
345 warning (_("Couldn't read %s section of %s"), 216 warning (_("Couldn't read %s section of %s"),
346 section_name, bfd_get_filename (abfd)); 217 section_name, bfd_get_filename (abfd));
347 218

error: old chunk mismatch

OLDNEW
« no previous file with comments | « gdb/python/lib/gdb/types.py ('k') | gdb/python/py-block.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698