From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 4273 invoked by alias); 13 Feb 2006 18:58:01 -0000 Received: (qmail 4168 invoked by uid 22791); 13 Feb 2006 18:57:54 -0000 X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (66.187.233.31) by sourceware.org (qpsmtpd/0.31) with ESMTP; Mon, 13 Feb 2006 18:57:47 +0000 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.11/8.12.11) with ESMTP id k1DIvWSg009092 for ; Mon, 13 Feb 2006 13:57:38 -0500 Received: from pobox.corp.redhat.com (pobox.corp.redhat.com [172.16.52.156]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id k1DIvW109687; Mon, 13 Feb 2006 13:57:32 -0500 Received: from free.oliva.athome.lsd.ic.unicamp.br (vpn50-33.rdu.redhat.com [172.16.50.33]) by pobox.corp.redhat.com (8.12.8/8.12.8) with ESMTP id k1DIvVBi024852; Mon, 13 Feb 2006 13:57:31 -0500 Received: from free.oliva.athome.lsd.ic.unicamp.br (free.oliva.athome.lsd.ic.unicamp.br [127.0.0.1]) by free.oliva.athome.lsd.ic.unicamp.br (8.13.5/8.13.5) with ESMTP id k1DIvUZ1011994; Mon, 13 Feb 2006 16:57:30 -0200 Received: (from aoliva@localhost) by free.oliva.athome.lsd.ic.unicamp.br (8.13.5/8.13.5/Submit) id k1DIvT3Z011944; Mon, 13 Feb 2006 16:57:29 -0200 To: Eli Zaretskii Cc: gdb-patches@sources.redhat.com Subject: Re: fixes for type-punning warnings in GCC 4.1 References: <20051219221830.GA32448@nevyn.them.org> <20060122203323.GC27224@nevyn.them.org> <20060208045905.GA12327@nevyn.them.org> <20060210013927.GA8310@nevyn.them.org> From: Alexandre Oliva Date: Mon, 13 Feb 2006 18:58:00 -0000 In-Reply-To: <20060210013927.GA8310@nevyn.them.org> (Daniel Jacobowitz's message of "Thu, 9 Feb 2006 20:39:27 -0500") Message-ID: User-Agent: Gnus/5.1007 (Gnus v5.10.7) XEmacs/21.4.18 (linux) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2006-02/txt/msg00288.txt.bz2 --=-=-= Content-length: 2042 On Feb 9, 2006, Daniel Jacobowitz wrote: > On Thu, Feb 09, 2006 at 10:32:48PM -0200, Alexandre Oliva wrote: >> On Feb 8, 2006, Daniel Jacobowitz wrote: >> >> > On Wed, Feb 08, 2006 at 12:48:11AM -0200, Alexandre Oliva wrote: >> >> On Jan 22, 2006, Daniel Jacobowitz wrote: >> >> >> >> > The output is always a DOUBLEST. I don't know of any reason why we >> >> > should enable HAVE_LONG_DOUBLE if we can't printf and scanf them; would >> >> > this be simpler in that case? Don't make DOUBLEST something we can't >> >> > scan or print. >> >> >> >> Sounds good to me. Ok to install? >> >> > Well, it's not right as-is; you need to look at the other uses of >> > HAVE_LONG_DOUBLE. >> >> Did. The other uses of HAVE_LONG_DOUBLE are correct, since they do >> not assume DOUBLEST is long double and they make no attempts at >> printing long doubles directly. > Disagree; did you read the bit of my message that you snipped? > doublest.c jumps through unnecessary hoops casting to long double and > back to handle a DOUBLEST if this is defined. Yep. It didn't look like those two occurrences were such a big deal. I don't see why we should refuse to handle long double at all just because we can't scan them in as such. But it's not my call, I guess. >> > Would you mind terribly fixing that, adding a changelog, and leaving >> > out the tui-data change for now? >> gdb won't build without the tui-data change. What's wrong with adding >> the temporary fix now, such that it builds, until someone with a >> better understanding can go ahead and re-engineer the data structure >> correctly? > Sorry, use -Wno-error if you're in that much of a hurry. I even > offered to take care of it for you. If your fix goes in, it will never > leave; we have plenty of experience with FIXMEs in GDB to back that up, > I think. Ok, I tried changing the type in the struct declaration and that seems to have worked, so I went ahead and removed the now-redundant type casts. Ok to install? --=-=-= Content-Type: text/x-patch Content-Disposition: inline; filename=gdb-type-punning-4.patch Content-length: 12346 for gdb/ChangeLog from Alexandre Oliva * doublest.h (DOUBLEST): Use long double only if we can scan it in. Undefine HAVE_LONG_DOUBLE otherwise. (DOUBLEST_FORMAT): New. * c-exp.y (parse_number): Use it. * jv-exp.y (parse_number): Likewise. * objc-exp.y (parse_number): Likewise. * p-exp.y (parse_number): Likewise. * varobj.c (free_variable): Silence type-punning warnings. * tui/tui-data.h (struct tui_list): Change type of list member. * tui/tui-data.c: Remove no-longer-needed type casts. (source_windows): Silence type-punning warnings. * tui/tui-stack.c, tui/tui-win.c, tui/tui-winsource.c: Likewise. Index: gdb/c-exp.y =================================================================== --- gdb/c-exp.y.orig 2006-02-13 16:33:29.000000000 -0200 +++ gdb/c-exp.y 2006-02-13 16:34:55.000000000 -0200 @@ -1080,24 +1080,8 @@ parse_number (p, len, parsed_float, puti char saved_char = p[len]; p[len] = 0; /* null-terminate the token */ - - if (sizeof (putithere->typed_val_float.dval) <= sizeof (float)) - num = sscanf (p, "%g%s", (float *) &putithere->typed_val_float.dval,s); - else if (sizeof (putithere->typed_val_float.dval) <= sizeof (double)) - num = sscanf (p, "%lg%s", (double *) &putithere->typed_val_float.dval,s); - else - { -#ifdef SCANF_HAS_LONG_DOUBLE - num = sscanf (p, "%Lg%s", &putithere->typed_val_float.dval,s); -#else - /* Scan it into a double, then assign it to the long double. - This at least wins with values representable in the range - of doubles. */ - double temp; - num = sscanf (p, "%lg%s", &temp,s); - putithere->typed_val_float.dval = temp; -#endif - } + num = sscanf (p, DOUBLEST_FORMAT "%s", + &putithere->typed_val_float.dval, s); p[len] = saved_char; /* restore the input stream */ if (num == 1) Index: gdb/jv-exp.y =================================================================== --- gdb/jv-exp.y.orig 2006-02-13 16:33:29.000000000 -0200 +++ gdb/jv-exp.y 2006-02-13 16:34:55.000000000 -0200 @@ -713,23 +713,8 @@ parse_number (p, len, parsed_float, puti char saved_char = p[len]; p[len] = 0; /* null-terminate the token */ - if (sizeof (putithere->typed_val_float.dval) <= sizeof (float)) - num = sscanf (p, "%g%c", (float *) &putithere->typed_val_float.dval, &c); - else if (sizeof (putithere->typed_val_float.dval) <= sizeof (double)) - num = sscanf (p, "%lg%c", (double *) &putithere->typed_val_float.dval, &c); - else - { -#ifdef SCANF_HAS_LONG_DOUBLE - num = sscanf (p, "%Lg%c", &putithere->typed_val_float.dval, &c); -#else - /* Scan it into a double, then assign it to the long double. - This at least wins with values representable in the range - of doubles. */ - double temp; - num = sscanf (p, "%lg%c", &temp, &c); - putithere->typed_val_float.dval = temp; -#endif - } + num = sscanf (p, DOUBLEST_FORMAT "%c", + &putithere->typed_val_float.dval, &c); p[len] = saved_char; /* restore the input stream */ if (num != 1) /* check scanf found ONLY a float ... */ return ERROR; Index: gdb/objc-exp.y =================================================================== --- gdb/objc-exp.y.orig 2006-02-13 16:33:29.000000000 -0200 +++ gdb/objc-exp.y 2006-02-13 16:34:55.000000000 -0200 @@ -1025,23 +1025,8 @@ parse_number (p, len, parsed_float, puti /* It's a float since it contains a point or an exponent. */ - if (sizeof (putithere->typed_val_float.dval) <= sizeof (float)) - sscanf (p, "%g", (float *)&putithere->typed_val_float.dval); - else if (sizeof (putithere->typed_val_float.dval) <= sizeof (double)) - sscanf (p, "%lg", (double *)&putithere->typed_val_float.dval); - else - { -#ifdef PRINTF_HAS_LONG_DOUBLE - sscanf (p, "%Lg", &putithere->typed_val_float.dval); -#else - /* Scan it into a double, then assign it to the long double. - This at least wins with values representable in the range - of doubles. */ - double temp; - sscanf (p, "%lg", &temp); - putithere->typed_val_float.dval = temp; -#endif - } + sscanf (p, DOUBLEST_FORMAT "%c", + &putithere->typed_val_float.dval, &c); /* See if it has `f' or `l' suffix (float or long double). */ Index: gdb/p-exp.y =================================================================== --- gdb/p-exp.y.orig 2006-02-13 16:33:29.000000000 -0200 +++ gdb/p-exp.y 2006-02-13 16:34:55.000000000 -0200 @@ -799,23 +799,8 @@ parse_number (p, len, parsed_float, puti char saved_char = p[len]; p[len] = 0; /* null-terminate the token */ - if (sizeof (putithere->typed_val_float.dval) <= sizeof (float)) - num = sscanf (p, "%g%c", (float *) &putithere->typed_val_float.dval,&c); - else if (sizeof (putithere->typed_val_float.dval) <= sizeof (double)) - num = sscanf (p, "%lg%c", (double *) &putithere->typed_val_float.dval,&c); - else - { -#ifdef SCANF_HAS_LONG_DOUBLE - num = sscanf (p, "%Lg%c", &putithere->typed_val_float.dval,&c); -#else - /* Scan it into a double, then assign it to the long double. - This at least wins with values representable in the range - of doubles. */ - double temp; - num = sscanf (p, "%lg%c", &temp,&c); - putithere->typed_val_float.dval = temp; -#endif - } + num = sscanf (p, DOUBLEST_FORMAT "%c", + &putithere->typed_val_float.dval, &c); p[len] = saved_char; /* restore the input stream */ if (num != 1) /* check scanf found ONLY a float ... */ return ERROR; Index: gdb/varobj.c =================================================================== --- gdb/varobj.c.orig 2006-02-13 16:33:29.000000000 -0200 +++ gdb/varobj.c 2006-02-13 16:34:55.000000000 -0200 @@ -1374,7 +1374,7 @@ free_variable (struct varobj *var) /* Free the expression if this is a root variable. */ if (var->root->rootvar == var) { - free_current_contents ((char **) &var->root->exp); + free_current_contents (&var->root->exp); xfree (var->root); } Index: gdb/doublest.h =================================================================== --- gdb/doublest.h.orig 2006-02-13 16:33:29.000000000 -0200 +++ gdb/doublest.h 2006-02-13 16:34:55.000000000 -0200 @@ -48,10 +48,15 @@ struct floatformat; host's `long double'. In general, we'll probably reduce the precision of any such values and print a warning. */ -#ifdef HAVE_LONG_DOUBLE +#if defined HAVE_LONG_DOUBLE && defined SCANF_HAS_LONG_DOUBLE typedef long double DOUBLEST; +# define DOUBLEST_FORMAT "%Lg" #else typedef double DOUBLEST; +# define DOUBLEST_FORMAT "%g" +/* If we can't scan or print long double, we don't want to use it + anywhere. */ +# undef HAVE_LONG_DOUBLE #endif extern void floatformat_to_doublest (const struct floatformat *, Index: gdb/tui/tui-data.c =================================================================== --- gdb/tui/tui-data.c.orig 2006-02-13 16:51:35.000000000 -0200 +++ gdb/tui/tui-data.c 2006-02-13 16:52:07.000000000 -0200 @@ -44,7 +44,7 @@ static int term_height, term_width; static struct tui_gen_win_info _locator; static struct tui_gen_win_info exec_info[2]; static struct tui_win_info * src_win_list[2]; -static struct tui_list source_windows = {(void **) src_win_list, 0}; +static struct tui_list source_windows = {src_win_list, 0}; static int default_tab_len = DEFAULT_TAB_LEN; static struct tui_win_info * win_with_focus = (struct tui_win_info *) NULL; static struct tui_layout_def layout_def = @@ -182,7 +182,7 @@ tui_clear_source_windows_detail (void) int i; for (i = 0; i < (tui_source_windows ())->count; i++) - tui_clear_win_detail ((struct tui_win_info *) (tui_source_windows ())->list[i]); + tui_clear_win_detail ((tui_source_windows ())->list[i]); } @@ -782,7 +782,7 @@ tui_free_all_source_wins_content (void) for (i = 0; i < (tui_source_windows ())->count; i++) { - struct tui_win_info * win_info = (struct tui_win_info *) (tui_source_windows ())->list[i]; + struct tui_win_info * win_info = (tui_source_windows ())->list[i]; if (win_info != NULL) { Index: gdb/tui/tui-data.h =================================================================== --- gdb/tui/tui-data.h.orig 2006-02-13 16:51:35.000000000 -0200 +++ gdb/tui/tui-data.h 2006-02-13 16:52:07.000000000 -0200 @@ -110,7 +110,7 @@ enum tui_scroll_direction /* General list struct. */ struct tui_list { - void **list; + struct tui_win_info **list; int count; }; Index: gdb/tui/tui-stack.c =================================================================== --- gdb/tui/tui-stack.c.orig 2006-02-13 16:51:35.000000000 -0200 +++ gdb/tui/tui-stack.c 2006-02-13 16:52:07.000000000 -0200 @@ -343,7 +343,7 @@ tui_show_frame_info (struct frame_info * for (i = 0; i < (tui_source_windows ())->count; i++) { union tui_which_element *item; - win_info = (struct tui_win_info *) (tui_source_windows ())->list[i]; + win_info = (tui_source_windows ())->list[i]; item = &((struct tui_win_element *) locator->content[0])->which_element; if (win_info == TUI_SRC_WIN) @@ -401,7 +401,7 @@ tui_show_frame_info (struct frame_info * tui_show_locator_content (); for (i = 0; i < (tui_source_windows ())->count; i++) { - win_info = (struct tui_win_info *) (tui_source_windows ())->list[i]; + win_info = (tui_source_windows ())->list[i]; tui_clear_source_content (win_info, EMPTY_SOURCE_PROMPT); tui_update_exec_info (win_info); } Index: gdb/tui/tui-win.c =================================================================== --- gdb/tui/tui-win.c.orig 2006-02-13 16:51:35.000000000 -0200 +++ gdb/tui/tui-win.c 2006-02-13 16:52:07.000000000 -0200 @@ -1119,7 +1119,7 @@ tui_adjust_win_heights (struct tui_win_i make_invisible_and_set_new_height (primary_win_info, new_height); if (primary_win_info->generic.type == CMD_WIN) { - win_info = (struct tui_win_info *) (tui_source_windows ())->list[0]; + win_info = (tui_source_windows ())->list[0]; src_win_info = win_info; } else @@ -1148,7 +1148,7 @@ tui_adjust_win_heights (struct tui_win_i else { first_win = TUI_DATA_WIN; - second_win = (struct tui_win_info *) (tui_source_windows ())->list[0]; + second_win = (tui_source_windows ())->list[0]; } if (primary_win_info == TUI_CMD_WIN) { /* @@ -1393,7 +1393,7 @@ new_height_ok (struct tui_win_info * pri struct tui_win_info * win_info; if (primary_win_info == TUI_CMD_WIN) - win_info = (struct tui_win_info *) (tui_source_windows ())->list[0]; + win_info = (tui_source_windows ())->list[0]; else win_info = TUI_CMD_WIN; ok = ((new_height + @@ -1414,7 +1414,7 @@ new_height_ok (struct tui_win_info * pri else { first_win = TUI_DATA_WIN; - second_win = (struct tui_win_info *) (tui_source_windows ())->list[0]; + second_win = (tui_source_windows ())->list[0]; } /* ** We could simply add all the heights to obtain the same result @@ -1543,7 +1543,7 @@ parse_scrolling_args (char *arg, struct error (_("Invalid window specified. \n\ The window name specified must be valid and visible.\n")); else if (*win_to_scroll == TUI_CMD_WIN) - *win_to_scroll = (struct tui_win_info *) (tui_source_windows ())->list[0]; + *win_to_scroll = (tui_source_windows ())->list[0]; } xfree (buf); } Index: gdb/tui/tui-winsource.c =================================================================== --- gdb/tui/tui-winsource.c.orig 2006-02-13 16:51:35.000000000 -0200 +++ gdb/tui/tui-winsource.c 2006-02-13 16:52:07.000000000 -0200 @@ -160,7 +160,7 @@ tui_update_source_windows_with_addr (COR for (i = 0; i < (tui_source_windows ())->count; i++) { - struct tui_win_info * win_info = (struct tui_win_info *) (tui_source_windows ())->list[i]; + struct tui_win_info * win_info = (tui_source_windows ())->list[i]; tui_clear_source_content (win_info, EMPTY_SOURCE_PROMPT); tui_clear_exec_info_content (win_info); @@ -384,7 +384,7 @@ tui_update_all_breakpoint_info (void) for (i = 0; i < list->count; i++) { - struct tui_win_info * win = (struct tui_win_info *) list->list[i]; + struct tui_win_info * win = list->list[i]; if (tui_update_breakpoint_info (win, FALSE)) { --=-=-= Content-length: 250 -- Alexandre Oliva http://www.lsd.ic.unicamp.br/~oliva/ Secretary for FSF Latin America http://www.fsfla.org/ Red Hat Compiler Engineer aoliva@{redhat.com, gcc.gnu.org} Free Software Evangelist oliva@{lsd.ic.unicamp.br, gnu.org} --=-=-=--