This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [Ada PATCH] Clean-up Ada front-end use of TREE_OVERFLOW


On 16 May 2005, Gabriel Dos Reis wrote:
> The changes look OK, with the caveat that the pretty_printer object
> should probably be constructed as part of gnat1 startup
> initialization, instead of waiting for the first call to abort where
> the compiler is already in a unspeakable state.
>
> The C and C++ front-end, for example, uses a global pretty-printer
> object that is initialized in toplev.c:general_init().  I have no idea
> whether toplev.c is included in gnat1 or not.  If yes, then maybe you
> might consider using the global_dc object.

Ah, ok, that makes sense.  This is a revision of the previous patch
that reuses the global global_dc->printer pretty_printer rather than
construct a local one.  I was originally following the examples set
by tree-mudflap.c:mf_varname_tree and c-pretty-print.c:print_c_tree
which both call pp_construct to create local pretty_printers guarded
by a static variable.  But your comments about internal_error using
a pre-constructed pretty-printer (such as reusing global_dc's) during
fatal error processing makes a lot of sense.

The following patch has been tested on i686-pc-linux-gnu with a "make",
including Ada, and regression tested with a "make check-gnat" and
confirming in acats.log that error messages in the gnat bug boxes
are correctly formatted.

Ok for mainline (Gaby and Richard K)?



2005-05-15  Roger Sayle  <roger@eyesopen.com>

	* misc.c (internal_error_function): Don't use vsprintf to format
	the error message text, instead use pp_format_text and the new
	pretty printer APIs.  This allows handling of %qs, %w, etc.


Index: misc.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/ada/misc.c,v
retrieving revision 1.101
diff -c -3 -p -r1.101 misc.c
*** misc.c	23 Apr 2005 21:28:09 -0000	1.101
--- misc.c	16 May 2005 02:00:48 -0000
*************** gnat_post_options (const char **pfilenam
*** 365,376 ****
  static void
  internal_error_function (const char *msgid, va_list *ap)
  {
!   char buffer[1000];		/* Assume this is big enough.  */
    char *p;
    String_Template temp;
    Fat_Pointer fp;

!   vsprintf (buffer, msgid, *ap);

    /* Go up to the first newline.  */
    for (p = buffer; *p; p++)
--- 365,387 ----
  static void
  internal_error_function (const char *msgid, va_list *ap)
  {
!   text_info tinfo;
!   char *buffer;
    char *p;
    String_Template temp;
    Fat_Pointer fp;

!   /* Reset the pretty-printer.  */
!   pp_clear_output_area (global_dc->printer);
!
!   /* Format the message into the pretty-printer.  */
!   tinfo.format_spec = msgid;
!   tinfo.args_ptr = ap;
!   tinfo.err_no = errno;
!   pp_format_text (global_dc->printer, &tinfo);
!
!   /* Extract a (writable) pointer to the formatted text.  */
!   buffer = (char*) pp_formatted_text (global_dc->printer);

    /* Go up to the first newline.  */
    for (p = buffer; *p; p++)
*************** internal_error_function (const char *msg
*** 380,387 ****
  	break;
        }

!   temp.Low_Bound = 1, temp.High_Bound = strlen (buffer);
!   fp.Array = buffer, fp.Bounds = &temp;

    Current_Error_Node = error_gnat_node;
    Compiler_Abort (fp, -1);
--- 391,400 ----
  	break;
        }

!   temp.Low_Bound = 1;
!   temp.High_Bound = p - buffer;
!   fp.Bounds = &temp;
!   fp.Array = buffer;

    Current_Error_Node = error_gnat_node;
    Compiler_Abort (fp, -1);


Roger
--


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]