Index: gdb/utils.c |
diff --git a/gdb/utils.c b/gdb/utils.c |
index 556614996b8bc14a804c105e210ebfe80c010b4f..975c43288639adf48b23d5c280be8b820da8d821 100644 |
--- a/gdb/utils.c |
+++ b/gdb/utils.c |
@@ -1,6 +1,6 @@ |
/* General utility routines for GDB, the GNU debugger. |
- Copyright (C) 1986, 1988-2012 Free Software Foundation, Inc. |
+ Copyright (C) 1986-2013 Free Software Foundation, Inc. |
This file is part of GDB. |
@@ -21,12 +21,13 @@ |
#include "dyn-string.h" |
#include "gdb_assert.h" |
#include <ctype.h> |
-#include "gdb_string.h" |
+#include <string.h> |
#include "gdb_wait.h" |
#include "event-top.h" |
#include "exceptions.h" |
#include "gdbthread.h" |
#include "fnmatch.h" |
+#include "gdb_bfd.h" |
#ifdef HAVE_SYS_RESOURCE_H |
#include <sys/resource.h> |
#endif /* HAVE_SYS_RESOURCE_H */ |
@@ -39,11 +40,6 @@ |
#include <pc.h> |
#endif |
-/* SunOS's curses.h has a '#define reg register' in it. Thank you Sun. */ |
-#ifdef reg |
-#undef reg |
-#endif |
- |
#include <signal.h> |
#include "timeval-utils.h" |
#include "gdbcmd.h" |
@@ -65,8 +61,6 @@ |
#include "inferior.h" /* for signed_pointer_to_address */ |
-#include <sys/param.h> /* For MAXPATHLEN */ |
- |
#include "gdb_curses.h" |
#include "readline/readline.h" |
@@ -88,9 +82,6 @@ extern PTR realloc (); /* ARI: PTR */ |
extern void free (); |
#endif |
-/* readline defines this. */ |
-#undef savestring |
- |
void (*deprecated_error_begin_hook) (void); |
/* Prototypes for local functions */ |
@@ -105,6 +96,14 @@ static void prompt_for_continue (void); |
static void set_screen_size (void); |
static void set_width (void); |
+/* Time spent in prompt_for_continue in the currently executing command |
+ waiting for user to respond. |
+ Initialized in make_command_stats_cleanup. |
+ Modified in prompt_for_continue and defaulted_query. |
+ Used in report_command_stats. */ |
+ |
+static struct timeval prompt_for_continue_wait_time; |
+ |
/* A flag indicating whether to timestamp debugging messages. */ |
static int debug_timestamp = 0; |
@@ -113,9 +112,11 @@ static int debug_timestamp = 0; |
int job_control; |
+#ifndef HAVE_PYTHON |
/* Nonzero means a quit has been requested. */ |
int quit_flag; |
+#endif /* HAVE_PYTHON */ |
/* Nonzero means quit immediately if Control-C is typed now, rather |
than waiting until QUIT is executed. Be careful in setting this; |
@@ -130,6 +131,41 @@ int quit_flag; |
int immediate_quit; |
+#ifndef HAVE_PYTHON |
+ |
+/* Clear the quit flag. */ |
+ |
+void |
+clear_quit_flag (void) |
+{ |
+ quit_flag = 0; |
+} |
+ |
+/* Set the quit flag. */ |
+ |
+void |
+set_quit_flag (void) |
+{ |
+ quit_flag = 1; |
+} |
+ |
+/* Return true if the quit flag has been set, false otherwise. */ |
+ |
+int |
+check_quit_flag (void) |
+{ |
+ /* This is written in a particular way to avoid races. */ |
+ if (quit_flag) |
+ { |
+ quit_flag = 0; |
+ return 1; |
+ } |
+ |
+ return 0; |
+} |
+ |
+#endif /* HAVE_PYTHON */ |
+ |
/* Nonzero means that strings with character values >0x7F should be printed |
as octal escapes. Zero means just print the value (e.g. it's an |
international character, and the terminal or window can cope.) */ |
@@ -144,14 +180,6 @@ show_sevenbit_strings (struct ui_file *file, int from_tty, |
value); |
} |
-/* String to be printed before error messages, if any. */ |
- |
-char *error_pre_print; |
- |
-/* String to be printed before quit messages, if any. */ |
- |
-char *quit_pre_print; |
- |
/* String to be printed before warning messages, if any. */ |
char *warning_pre_print = "\nwarning: "; |
@@ -198,11 +226,11 @@ make_cleanup_dyn_string_delete (dyn_string_t arg) |
static void |
do_bfd_close_cleanup (void *arg) |
{ |
- bfd_close (arg); |
+ gdb_bfd_unref (arg); |
} |
struct cleanup * |
-make_cleanup_bfd_close (bfd *abfd) |
+make_cleanup_bfd_unref (bfd *abfd) |
{ |
return make_cleanup (do_bfd_close_cleanup, abfd); |
} |
@@ -457,6 +485,28 @@ make_cleanup_free_so (struct so_list *so) |
return make_cleanup (do_free_so, so); |
} |
+/* Helper for make_cleanup_restore_current_language. */ |
+ |
+static void |
+do_restore_current_language (void *p) |
+{ |
+ enum language saved_lang = (uintptr_t) p; |
+ |
+ set_language (saved_lang); |
+} |
+ |
+/* Remember the current value of CURRENT_LANGUAGE and make it restored when |
+ the cleanup is run. */ |
+ |
+struct cleanup * |
+make_cleanup_restore_current_language (void) |
+{ |
+ enum language saved_lang = current_language->la_language; |
+ |
+ return make_cleanup (do_restore_current_language, |
+ (void *) (uintptr_t) saved_lang); |
+} |
+ |
/* This function is useful for cleanups. |
Do |
@@ -479,109 +529,6 @@ free_current_contents (void *ptr) |
*location = NULL; |
} |
} |
- |
-/* If nonzero, display time usage both at startup and for each command. */ |
- |
-static int display_time; |
- |
-/* If nonzero, display space usage both at startup and for each command. */ |
- |
-static int display_space; |
- |
-/* Records a run time and space usage to be used as a base for |
- reporting elapsed time or change in space. In addition, |
- the msg_type field indicates whether the saved time is from the |
- beginning of GDB execution (0) or the beginning of an individual |
- command execution (1). */ |
-struct cmd_stats |
-{ |
- int msg_type; |
- long start_cpu_time; |
- struct timeval start_wall_time; |
- long start_space; |
-}; |
- |
-/* Set whether to display time statistics to NEW_VALUE (non-zero |
- means true). */ |
-void |
-set_display_time (int new_value) |
-{ |
- display_time = new_value; |
-} |
- |
-/* Set whether to display space statistics to NEW_VALUE (non-zero |
- means true). */ |
-void |
-set_display_space (int new_value) |
-{ |
- display_space = new_value; |
-} |
- |
-/* As indicated by display_time and display_space, report GDB's elapsed time |
- and space usage from the base time and space provided in ARG, which |
- must be a pointer to a struct cmd_stat. This function is intended |
- to be called as a cleanup. */ |
-static void |
-report_command_stats (void *arg) |
-{ |
- struct cmd_stats *start_stats = (struct cmd_stats *) arg; |
- int msg_type = start_stats->msg_type; |
- |
- if (display_time) |
- { |
- long cmd_time = get_run_time () - start_stats->start_cpu_time; |
- struct timeval now_wall_time, delta_wall_time; |
- |
- gettimeofday (&now_wall_time, NULL); |
- timeval_sub (&delta_wall_time, |
- &now_wall_time, &start_stats->start_wall_time); |
- |
- printf_unfiltered (msg_type == 0 |
- ? _("Startup time: %ld.%06ld (cpu), %ld.%06ld (wall)\n") |
- : _("Command execution time: %ld.%06ld (cpu), %ld.%06ld (wall)\n"), |
- cmd_time / 1000000, cmd_time % 1000000, |
- (long) delta_wall_time.tv_sec, |
- (long) delta_wall_time.tv_usec); |
- } |
- |
- if (display_space) |
- { |
-#ifdef HAVE_SBRK |
- char *lim = (char *) sbrk (0); |
- |
- long space_now = lim - lim_at_start; |
- long space_diff = space_now - start_stats->start_space; |
- |
- printf_unfiltered (msg_type == 0 |
- ? _("Space used: %ld (%s%ld during startup)\n") |
- : _("Space used: %ld (%s%ld for this command)\n"), |
- space_now, |
- (space_diff >= 0 ? "+" : ""), |
- space_diff); |
-#endif |
- } |
-} |
- |
-/* Create a cleanup that reports time and space used since its |
- creation. Precise messages depend on MSG_TYPE: |
- 0: Initial time/space |
- 1: Individual command time/space. */ |
-struct cleanup * |
-make_command_stats_cleanup (int msg_type) |
-{ |
- struct cmd_stats *new_stat = XMALLOC (struct cmd_stats); |
- |
-#ifdef HAVE_SBRK |
- char *lim = (char *) sbrk (0); |
- new_stat->start_space = lim - lim_at_start; |
-#endif |
- |
- new_stat->msg_type = msg_type; |
- new_stat->start_cpu_time = get_run_time (); |
- gettimeofday (&new_stat->start_wall_time, NULL); |
- |
- return make_cleanup_dtor (report_command_stats, new_stat, xfree); |
-} |
@@ -751,6 +698,7 @@ internal_vproblem (struct internal_problem *problem, |
int quit_p; |
int dump_core_p; |
char *reason; |
+ struct cleanup *cleanup = make_cleanup (null_cleanup, NULL); |
/* Don't allow infinite error/warning recursion. */ |
{ |
@@ -859,6 +807,7 @@ internal_vproblem (struct internal_problem *problem, |
} |
dejavu = 0; |
+ do_cleanups (cleanup); |
} |
static struct internal_problem internal_error_problem = { |
@@ -869,7 +818,7 @@ void |
internal_verror (const char *file, int line, const char *fmt, va_list ap) |
{ |
internal_vproblem (&internal_error_problem, file, line, fmt, ap); |
- deprecated_throw_reason (RETURN_ERROR); |
+ fatal (_("Command aborted.")); |
} |
void |
@@ -1003,29 +952,66 @@ add_internal_problem_command (struct internal_problem *problem) |
xfree (show_doc); |
} |
-/* Print the system error message for errno, and also mention STRING |
- as the file name for which the error was encountered. |
- Then return to command level. */ |
+/* Return a newly allocated string, containing the PREFIX followed |
+ by the system error message for errno (separated by a colon). |
-void |
-perror_with_name (const char *string) |
+ The result must be deallocated after use. */ |
+ |
+static char * |
+perror_string (const char *prefix) |
{ |
char *err; |
char *combined; |
err = safe_strerror (errno); |
- combined = (char *) alloca (strlen (err) + strlen (string) + 3); |
- strcpy (combined, string); |
+ combined = (char *) xmalloc (strlen (err) + strlen (prefix) + 3); |
+ strcpy (combined, prefix); |
strcat (combined, ": "); |
strcat (combined, err); |
+ return combined; |
+} |
+ |
+/* Print the system error message for errno, and also mention STRING |
+ as the file name for which the error was encountered. Use ERRCODE |
+ for the thrown exception. Then return to command level. */ |
+ |
+void |
+throw_perror_with_name (enum errors errcode, const char *string) |
+{ |
+ char *combined; |
+ |
+ combined = perror_string (string); |
+ make_cleanup (xfree, combined); |
+ |
/* I understand setting these is a matter of taste. Still, some people |
may clear errno but not know about bfd_error. Doing this here is not |
unreasonable. */ |
bfd_set_error (bfd_error_no_error); |
errno = 0; |
- error (_("%s."), combined); |
+ throw_error (errcode, _("%s."), combined); |
+} |
+ |
+/* See throw_perror_with_name, ERRCODE defaults here to GENERIC_ERROR. */ |
+ |
+void |
+perror_with_name (const char *string) |
+{ |
+ throw_perror_with_name (GENERIC_ERROR, string); |
+} |
+ |
+/* Same as perror_with_name except that it prints a warning instead |
+ of throwing an error. */ |
+ |
+void |
+perror_warning_with_name (const char *string) |
+{ |
+ char *combined; |
+ |
+ combined = perror_string (string); |
+ warning (_("%s"), combined); |
+ xfree (combined); |
} |
/* Print the system error message for ERRCODE, and also mention STRING |
@@ -1110,20 +1096,6 @@ myread (int desc, char *addr, int len) |
return orglen; |
} |
-/* Make a copy of the string at PTR with SIZE characters |
- (and add a null character at the end in the copy). |
- Uses malloc to get the space. Returns the address of the copy. */ |
- |
-char * |
-savestring (const char *ptr, size_t size) |
-{ |
- char *p = (char *) xmalloc (size + 1); |
- |
- memcpy (p, ptr, size); |
- p[size] = 0; |
- return p; |
-} |
- |
void |
print_spaces (int n, struct ui_file *file) |
{ |
@@ -1168,6 +1140,29 @@ get_regcomp_error (int code, regex_t *rx) |
return result; |
} |
+/* Compile a regexp and throw an exception on error. This returns a |
+ cleanup to free the resulting pattern on success. RX must not be |
+ NULL. */ |
+ |
+struct cleanup * |
+compile_rx_or_error (regex_t *pattern, const char *rx, const char *message) |
+{ |
+ int code; |
+ |
+ gdb_assert (rx != NULL); |
+ |
+ code = regcomp (pattern, rx, REG_NOSUB); |
+ if (code != 0) |
+ { |
+ char *err = get_regcomp_error (code, pattern); |
+ |
+ make_cleanup (xfree, err); |
+ error (("%s: %s"), message, err); |
+ } |
+ |
+ return make_regfree_cleanup (pattern); |
+} |
+ |
/* This function supports the query, nquery, and yquery functions. |
@@ -1189,6 +1184,9 @@ defaulted_query (const char *ctlstr, const char defchar, va_list args) |
int def_value; |
char def_answer, not_def_answer; |
char *y_string, *n_string, *question; |
+ /* Used to add duration we waited for user to respond to |
+ prompt_for_continue_wait_time. */ |
+ struct timeval prompt_started, prompt_ended, prompt_delta; |
/* Set up according to which answer is the default. */ |
if (defchar == '\0') |
@@ -1246,6 +1244,9 @@ defaulted_query (const char *ctlstr, const char defchar, va_list args) |
/* Format the question outside of the loop, to avoid reusing args. */ |
question = xstrvprintf (ctlstr, args); |
+ /* Used for calculating time spend waiting for user. */ |
+ gettimeofday (&prompt_started, NULL); |
+ |
while (1) |
{ |
wrap_here (""); /* Flush any buffered output. */ |
@@ -1323,6 +1324,12 @@ defaulted_query (const char *ctlstr, const char defchar, va_list args) |
y_string, n_string); |
} |
+ /* Add time spend in this routine to prompt_for_continue_wait_time. */ |
+ gettimeofday (&prompt_ended, NULL); |
+ timeval_sub (&prompt_delta, &prompt_ended, &prompt_started); |
+ timeval_add (&prompt_for_continue_wait_time, |
+ &prompt_for_continue_wait_time, &prompt_delta); |
+ |
xfree (question); |
if (annotation_level > 1) |
printf_filtered (("\n\032\032post-query\n")); |
@@ -1400,7 +1407,8 @@ host_char_to_target (struct gdbarch *gdbarch, int c, int *target_c) |
cleanups = make_cleanup_obstack_free (&host_data); |
convert_between_encodings (target_charset (gdbarch), host_charset (), |
- &the_char, 1, 1, &host_data, translit_none); |
+ (gdb_byte *) &the_char, 1, 1, |
+ &host_data, translit_none); |
if (obstack_object_size (&host_data) == 1) |
{ |
@@ -1428,7 +1436,7 @@ host_char_to_target (struct gdbarch *gdbarch, int c, int *target_c) |
after the zeros. A value of 0 does not mean end of string. */ |
int |
-parse_escape (struct gdbarch *gdbarch, char **string_ptr) |
+parse_escape (struct gdbarch *gdbarch, const char **string_ptr) |
{ |
int target_char = -2; /* Initialize to avoid GCC warnings. */ |
int c = *(*string_ptr)++; |
@@ -1676,20 +1684,19 @@ init_page_info (void) |
lines_per_page = rows; |
chars_per_line = cols; |
- /* Readline should have fetched the termcap entry for us. */ |
- if (tgetnum ("li") < 0 || getenv ("EMACS")) |
+ /* Readline should have fetched the termcap entry for us. |
+ Only try to use tgetnum function if rl_get_screen_size |
+ did not return a useful value. */ |
+ if (((rows <= 0) && (tgetnum ("li") < 0)) |
+ /* Also disable paging if inside EMACS. */ |
+ || getenv ("EMACS")) |
{ |
- /* The number of lines per page is not mentioned in the |
- terminal description. This probably means that paging is |
- not useful (e.g. emacs shell window), so disable paging. */ |
+ /* The number of lines per page is not mentioned in the terminal |
+ description or EMACS evironment variable is set. This probably |
+ means that paging is not useful, so disable paging. */ |
lines_per_page = UINT_MAX; |
} |
- /* FIXME: Get rid of this junk. */ |
-#if defined(SIGWINCH) && defined(SIGWINCH_HANDLER) |
- SIGWINCH_HANDLER (SIGWINCH); |
-#endif |
- |
/* If the output is not a terminal, don't paginate it. */ |
if (!ui_file_isatty (gdb_stdout)) |
lines_per_page = UINT_MAX; |
@@ -1796,6 +1803,11 @@ prompt_for_continue (void) |
{ |
char *ignore; |
char cont_prompt[120]; |
+ /* Used to add duration we waited for user to respond to |
+ prompt_for_continue_wait_time. */ |
+ struct timeval prompt_started, prompt_ended, prompt_delta; |
+ |
+ gettimeofday (&prompt_started, NULL); |
if (annotation_level > 1) |
printf_unfiltered (("\n\032\032pre-prompt-for-continue\n")); |
@@ -1811,6 +1823,7 @@ prompt_for_continue (void) |
reinitialize_more_filter (); |
immediate_quit++; |
+ QUIT; |
/* On a real operating system, the user can quit with SIGINT. |
But not on GO32. |
@@ -1823,6 +1836,12 @@ prompt_for_continue (void) |
out to DOS. */ |
ignore = gdb_readline_wrapper (cont_prompt); |
+ /* Add time spend in this routine to prompt_for_continue_wait_time. */ |
+ gettimeofday (&prompt_ended, NULL); |
+ timeval_sub (&prompt_delta, &prompt_ended, &prompt_started); |
+ timeval_add (&prompt_for_continue_wait_time, |
+ &prompt_for_continue_wait_time, &prompt_delta); |
+ |
if (annotation_level > 1) |
printf_unfiltered (("\n\032\032post-prompt-for-continue\n")); |
@@ -1833,7 +1852,7 @@ prompt_for_continue (void) |
while (*p == ' ' || *p == '\t') |
++p; |
if (p[0] == 'q') |
- async_request_quit (0); |
+ quit (); |
xfree (ignore); |
} |
immediate_quit--; |
@@ -1845,6 +1864,24 @@ prompt_for_continue (void) |
dont_repeat (); /* Forget prev cmd -- CR won't repeat it. */ |
} |
+/* Initalize timer to keep track of how long we waited for the user. */ |
+ |
+void |
+reset_prompt_for_continue_wait_time (void) |
+{ |
+ static const struct timeval zero_timeval = { 0 }; |
+ |
+ prompt_for_continue_wait_time = zero_timeval; |
+} |
+ |
+/* Fetch the cumulative time spent in prompt_for_continue. */ |
+ |
+struct timeval |
+get_prompt_for_continue_wait_time (void) |
+{ |
+ return prompt_for_continue_wait_time; |
+} |
+ |
/* Reinitialize filter; ie. tell it to reset to original values. */ |
void |
@@ -2654,15 +2691,20 @@ void |
initialize_utils (void) |
{ |
add_setshow_uinteger_cmd ("width", class_support, &chars_per_line, _("\ |
-Set number of characters gdb thinks are in a line."), _("\ |
-Show number of characters gdb thinks are in a line."), NULL, |
+Set number of characters where GDB should wrap lines of its output."), _("\ |
+Show number of characters where GDB should wrap lines of its output."), _("\ |
+This affects where GDB wraps its output to fit the screen width.\n\ |
+Setting this to \"unlimited\" or zero prevents GDB from wrapping its output."), |
set_width_command, |
show_chars_per_line, |
&setlist, &showlist); |
add_setshow_uinteger_cmd ("height", class_support, &lines_per_page, _("\ |
-Set number of lines gdb thinks are in a page."), _("\ |
-Show number of lines gdb thinks are in a page."), NULL, |
+Set number of lines in a page for GDB output pagination."), _("\ |
+Show number of lines in a page for GDB output pagination."), _("\ |
+This affects the number of lines after which GDB will pause\n\ |
+its output and ask you whether to continue.\n\ |
+Setting this to \"unlimited\" or zero causes GDB never pause during output."), |
set_height_command, |
show_lines_per_page, |
&setlist, &showlist); |
@@ -2671,8 +2713,11 @@ Show number of lines gdb thinks are in a page."), NULL, |
add_setshow_boolean_cmd ("pagination", class_support, |
&pagination_enabled, _("\ |
-Set state of pagination."), _("\ |
-Show state of pagination."), NULL, |
+Set state of GDB output pagination."), _("\ |
+Show state of GDB output pagination."), _("\ |
+When pagination is ON, GDB pauses at end of each screenful of\n\ |
+its output and asks you whether to continue.\n\ |
+Turning pagination off is an alternative to \"set height unlimited\"."), |
NULL, |
show_pagination_enabled, |
&setlist, &showlist); |
@@ -2703,11 +2748,6 @@ When set, debugging messages will be marked with seconds and microseconds."), |
&setdebuglist, &showdebuglist); |
} |
-/* Machine specific function to handle SIGWINCH signal. */ |
- |
-#ifdef SIGWINCH_HANDLER_BODY |
-SIGWINCH_HANDLER_BODY |
-#endif |
/* Print routines to handle variable size regs, etc. */ |
/* Temporary storage using circular buffer. */ |
#define NUMCELLS 16 |
@@ -3108,22 +3148,14 @@ gdb_realpath (const char *filename) |
path. Use that and realpath() to canonicalize the name. This is |
the most common case. Note that, if there isn't a compile time |
upper bound, you want to avoid realpath() at all costs. */ |
-#if defined(HAVE_REALPATH) |
+#if defined (HAVE_REALPATH) && defined (PATH_MAX) |
{ |
-# if defined (PATH_MAX) |
char buf[PATH_MAX]; |
-# define USE_REALPATH |
-# elif defined (MAXPATHLEN) |
- char buf[MAXPATHLEN]; |
-# define USE_REALPATH |
-# endif |
-# if defined (USE_REALPATH) |
const char *rp = realpath (filename, buf); |
if (rp == NULL) |
rp = filename; |
return xstrdup (rp); |
-# endif |
} |
#endif /* HAVE_REALPATH */ |
@@ -3157,7 +3189,7 @@ gdb_realpath (const char *filename) |
pathconf()) making it impossible to pass a correctly sized buffer |
to realpath() (it could always overflow). On those systems, we |
skip this. */ |
-#if defined (HAVE_REALPATH) && defined (HAVE_UNISTD_H) && defined(HAVE_ALLOCA) |
+#if defined (HAVE_REALPATH) && defined (_PC_PATH_MAX) && defined(HAVE_ALLOCA) |
{ |
/* Find out the max path size. */ |
long path_max = pathconf ("/", _PC_PATH_MAX); |
@@ -3200,7 +3232,7 @@ gdb_realpath (const char *filename) |
by gdb_realpath. */ |
char * |
-xfullpath (const char *filename) |
+gdb_realpath_keepfile (const char *filename) |
{ |
const char *base_name = lbasename (filename); |
char *dir_name; |
@@ -3242,75 +3274,30 @@ xfullpath (const char *filename) |
return result; |
} |
+/* Return PATH in absolute form, performing tilde-expansion if necessary. |
+ PATH cannot be NULL or the empty string. |
+ This does not resolve symlinks however, use gdb_realpath for that. |
+ Space for the result is allocated with malloc. |
+ If the path is already absolute, it is strdup'd. |
+ If there is a problem computing the absolute path, the path is returned |
+ unchanged (still strdup'd). */ |
+ |
+char * |
+gdb_abspath (const char *path) |
+{ |
+ gdb_assert (path != NULL && path[0] != '\0'); |
+ |
+ if (path[0] == '~') |
+ return tilde_expand (path); |
+ |
+ if (IS_ABSOLUTE_PATH (path)) |
+ return xstrdup (path); |
-/* This is the 32-bit CRC function used by the GNU separate debug |
- facility. An executable may contain a section named |
- .gnu_debuglink, which holds the name of a separate executable file |
- containing its debug info, and a checksum of that file's contents, |
- computed using this function. */ |
-unsigned long |
-gnu_debuglink_crc32 (unsigned long crc, unsigned char *buf, size_t len) |
-{ |
- static const unsigned int crc32_table[256] = { |
- 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, |
- 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, |
- 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, |
- 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, |
- 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, |
- 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, |
- 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, |
- 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, |
- 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, |
- 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, |
- 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, |
- 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, |
- 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, |
- 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, |
- 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, |
- 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, |
- 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, |
- 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, |
- 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, |
- 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, |
- 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, |
- 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, |
- 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, |
- 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, |
- 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, |
- 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, |
- 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, |
- 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, |
- 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, |
- 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, |
- 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, |
- 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, |
- 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, |
- 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, |
- 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, |
- 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, |
- 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, |
- 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, |
- 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, |
- 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, |
- 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, |
- 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, |
- 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, |
- 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, |
- 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, |
- 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, |
- 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, |
- 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, |
- 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, |
- 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, |
- 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, |
- 0x2d02ef8d |
- }; |
- unsigned char *end; |
- |
- crc = ~crc & 0xffffffff; |
- for (end = buf + len; buf < end; ++buf) |
- crc = crc32_table[(crc ^ *buf) & 0xff] ^ (crc >> 8); |
- return ~crc & 0xffffffff; |
+ /* Beware the // my son, the Emacs barfs, the botch that catch... */ |
+ return concat (current_directory, |
+ IS_DIR_SEPARATOR (current_directory[strlen (current_directory) - 1]) |
+ ? "" : SLASH_STRING, |
+ path, (char *) NULL); |
} |
ULONGEST |
@@ -3329,6 +3316,23 @@ align_down (ULONGEST v, int n) |
return (v & -n); |
} |
+/* See utils.h. */ |
+ |
+LONGEST |
+gdb_sign_extend (LONGEST value, int bit) |
+{ |
+ gdb_assert (bit >= 1 && bit <= 8 * sizeof (LONGEST)); |
+ |
+ if (((value >> (bit - 1)) & 1) != 0) |
+ { |
+ LONGEST signbit = ((LONGEST) 1) << (bit - 1); |
+ |
+ value = (value ^ signbit) - signbit; |
+ } |
+ |
+ return value; |
+} |
+ |
/* Allocation function for the libiberty hash table which uses an |
obstack. The obstack is passed as DATA. */ |
@@ -3636,24 +3640,6 @@ producer_is_gcc_ge_4 (const char *producer) |
return minor; |
} |
-/* Call xfree for each element of CHAR_PTR_VEC and final VEC_free for |
- CHAR_PTR_VEC itself. |
- |
- You must not modify CHAR_PTR_VEC after it got registered with this function |
- by make_cleanup as the CHAR_PTR_VEC base address may change on its updates. |
- Contrary to VEC_free this function does not (cannot) clear the pointer. */ |
- |
-void |
-free_char_ptr_vec (VEC (char_ptr) *char_ptr_vec) |
-{ |
- int ix; |
- char *name; |
- |
- for (ix = 0; VEC_iterate (char_ptr, char_ptr_vec, ix, name); ++ix) |
- xfree (name); |
- VEC_free (char_ptr, char_ptr_vec); |
-} |
- |
/* Helper for make_cleanup_free_char_ptr_vec. */ |
static void |
@@ -3677,54 +3663,6 @@ make_cleanup_free_char_ptr_vec (VEC (char_ptr) *char_ptr_vec) |
return make_cleanup (do_free_char_ptr_vec, char_ptr_vec); |
} |
-/* Extended version of dirnames_to_char_ptr_vec - additionally if *VECP is |
- non-NULL the new list elements from DIRNAMES are appended to the existing |
- *VECP list of entries. *VECP address will be updated by this call. */ |
- |
-void |
-dirnames_to_char_ptr_vec_append (VEC (char_ptr) **vecp, const char *dirnames) |
-{ |
- do |
- { |
- size_t this_len; |
- char *next_dir, *this_dir; |
- |
- next_dir = strchr (dirnames, DIRNAME_SEPARATOR); |
- if (next_dir == NULL) |
- this_len = strlen (dirnames); |
- else |
- { |
- this_len = next_dir - dirnames; |
- next_dir++; |
- } |
- |
- this_dir = xmalloc (this_len + 1); |
- memcpy (this_dir, dirnames, this_len); |
- this_dir[this_len] = '\0'; |
- VEC_safe_push (char_ptr, *vecp, this_dir); |
- |
- dirnames = next_dir; |
- } |
- while (dirnames != NULL); |
-} |
- |
-/* Split DIRNAMES by DIRNAME_SEPARATOR delimiter and return a list of all the |
- elements in their original order. For empty string ("") DIRNAMES return |
- list of one empty string ("") element. |
- |
- You may modify the returned strings. |
- Read free_char_ptr_vec for its cleanup. */ |
- |
-VEC (char_ptr) * |
-dirnames_to_char_ptr_vec (const char *dirnames) |
-{ |
- VEC (char_ptr) *retval = NULL; |
- |
- dirnames_to_char_ptr_vec_append (&retval, dirnames); |
- |
- return retval; |
-} |
- |
/* Substitute all occurences of string FROM by string TO in *STRINGP. *STRINGP |
must come from xrealloc-compatible allocator and it may be updated. FROM |
needs to be delimited by IS_DIR_SEPARATOR or DIRNAME_SEPARATOR (or be |