public inbox for gcc@gcc.gnu.org
 help / color / mirror / Atom feed
* Re: more pch questions
@ 2003-03-11 19:05 Benjamin Kosnik
  2003-03-11 19:29 ` Geoffrey Keating
  0 siblings, 1 reply; 8+ messages in thread
From: Benjamin Kosnik @ 2003-03-11 19:05 UTC (permalink / raw)
  To: geoffk; +Cc: gcc


Hmmm. You keep saying this, and I keep telling you that -Winvalid-pch 
doesn't hack it.

So. In this case, when I'm compiling with a found .gch file, and it's 
found to be invalid, -Winvalid-pch says nothing.

Can you please take a look at this?

-benjamin

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: more pch questions
  2003-03-11 19:05 more pch questions Benjamin Kosnik
@ 2003-03-11 19:29 ` Geoffrey Keating
  2003-03-12  7:22   ` Benjamin Kosnik
  0 siblings, 1 reply; 8+ messages in thread
From: Geoffrey Keating @ 2003-03-11 19:29 UTC (permalink / raw)
  To: Benjamin Kosnik; +Cc: gcc


On Tuesday, March 11, 2003, at 11:01  AM, Benjamin Kosnik wrote:

>
> Hmmm. You keep saying this, and I keep telling you that -Winvalid-pch
> doesn't hack it.
>
> So. In this case, when I'm compiling with a found .gch file, and it's
> found to be invalid, -Winvalid-pch says nothing.

You're saying that execution reaches the fail: label in 
cpp_valid_state.  Execution can't fall through to there, there are only 
three places that have 'goto fail' in that routine, and each one has a 
call to cpp_error right before it, switched on by 'warn_invalid_pch'.

So, if -Winvalid-pch says nothing, then there's something very wrong, 
maybe a codegen problem in the stage1 compiler.

I don't have very much time to be debugging these problems; I have 
other, more serious problems that I must fix first (at the moment, I'm 
working on #import, which is a complete showstopper for Apple).  It 
would help a lot if you could produce simple testcases that I don't 
need to apply compiler patches to run.

-- 
Geoff Keating <geoffk@apple.com>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: more pch questions
  2003-03-11 19:29 ` Geoffrey Keating
@ 2003-03-12  7:22   ` Benjamin Kosnik
  2003-03-12  7:46     ` Gareth Pearce
  2003-03-12 20:08     ` Geoff Keating
  0 siblings, 2 replies; 8+ messages in thread
From: Benjamin Kosnik @ 2003-03-12  7:22 UTC (permalink / raw)
  To: Geoffrey Keating; +Cc: gcc


>You're saying that execution reaches the fail: label in 
>cpp_valid_state.  Execution can't fall through to there, there are only 
>three places that have 'goto fail' in that routine, and each one has a 
>call to cpp_error right before it, switched on by 'warn_invalid_pch'.

Yes.

>So, if -Winvalid-pch says nothing, then there's something very wrong, 
>maybe a codegen problem in the stage1 compiler.

No.

-Winvalid-pch says nothing because in _cpp_begin_message, 

  switch (level)
    {
    case DL_WARNING:
    case DL_PEDWARN:
      if (CPP_IN_SYSTEM_HEADER (pfile)
	  && ! CPP_OPTION (pfile, warn_system_headers))
	return 0;

returns zero, because the pch in question includes files marked as
system headers (C++ <string>) and I didn't specify 

 -Winvalid-pch -Wsystem-headers

When I do, I get:

In file included from test_pch.cc:1:
/mnt/hd/bld/gcc/i686-pc-linux-gnu/libstdc++-v3/include/string:45:20:
warning:
/mnt/hd/bld/gcc/i686-pc-linux-gnu/libstdc++-v3/include/stdc++.h.gch: not
used because `_CPP_STRING' is defined 

Perhaps a better way of getting this message would be to use DL_WARNING_SYSHDR,
not DL_WARNING in cpp_valid_state. See attached patch. There are other,
perhaps unrelated problems with pch files and system headers (see
other/9471).

I'm still not quite sure what the error message, when I can see it,
means. Any insights? Why does _CPP_STRING being defined matter?

Since the generated pch file is invalid, I'll try to fix this as well.

-benjamin

2003-03-11  Benjamin Kosnik  <bkoz@redhat.com>

	* cpppch.c (cpp_valid_state): Use DL_WARNING_SYSHDR, not
	DL_WARNING so that errors in system includes are shown.

Index: cpppch.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cpppch.c,v
retrieving revision 1.2
diff -c -p -r1.2 cpppch.c
*** cpppch.c	10 Jan 2003 02:21:59 -0000	1.2
--- cpppch.c	12 Mar 2003 04:50:47 -0000
*************** cpp_valid_state (r, name, fd)
*** 417,423 ****
  	  || h->flags & NODE_POISONED)
  	{
  	  if (CPP_OPTION (r, warn_invalid_pch))
! 	    cpp_error (r, DL_WARNING,
  		       "%s: not used because `%.*s' not defined",
  		       name, m.name_length, namebuf);
  	  goto fail;
--- 417,423 ----
  	  || h->flags & NODE_POISONED)
  	{
  	  if (CPP_OPTION (r, warn_invalid_pch))
! 	    cpp_error (r, DL_WARNING_SYSHDR,
  		       "%s: not used because `%.*s' not defined",
  		       name, m.name_length, namebuf);
  	  goto fail;
*************** cpp_valid_state (r, name, fd)
*** 429,435 ****
  	  || memcmp (namebuf, newdefn, m.definition_length) != 0)
  	{
  	  if (CPP_OPTION (r, warn_invalid_pch))
! 	    cpp_error (r, DL_WARNING, 
  	       "%s: not used because `%.*s' defined as `%s' not `%.*s'",
  		       name, m.name_length, namebuf, newdefn + m.name_length,
  		       m.definition_length - m.name_length,
--- 429,435 ----
  	  || memcmp (namebuf, newdefn, m.definition_length) != 0)
  	{
  	  if (CPP_OPTION (r, warn_invalid_pch))
! 	    cpp_error (r, DL_WARNING_SYSHDR,
  	       "%s: not used because `%.*s' defined as `%s' not `%.*s'",
  		       name, m.name_length, namebuf, newdefn + m.name_length,
  		       m.definition_length - m.name_length,
*************** cpp_valid_state (r, name, fd)
*** 454,460 ****
  	  || h->flags & NODE_POISONED)
  	{
  	  if (CPP_OPTION (r, warn_invalid_pch))
! 	    cpp_error (r, DL_WARNING, "%s: not used because `%s' is defined",
  		       name, undeftab + i);
  	  goto fail;
  	}
--- 454,461 ----
  	  || h->flags & NODE_POISONED)
  	{
  	  if (CPP_OPTION (r, warn_invalid_pch))
! 	    cpp_error (r, DL_WARNING_SYSHDR, 
! 		       "%s: not used because `%s' is defined",
  		       name, undeftab + i);
  	  goto fail;
  	}

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: more pch questions
  2003-03-12  7:22   ` Benjamin Kosnik
@ 2003-03-12  7:46     ` Gareth Pearce
  2003-03-12 20:08     ` Geoff Keating
  1 sibling, 0 replies; 8+ messages in thread
From: Gareth Pearce @ 2003-03-12  7:46 UTC (permalink / raw)
  To: Benjamin Kosnik; +Cc: gcc


> I'm still not quite sure what the error message, when I can see it,
> means. Any insights? Why does _CPP_STRING being defined matter?

pch tries to provide no visible difference between it being on and off.
Therefore the status of #defines going into the header when its
precompiled - and going into its use, must be identical - since otherwise
theres potential for the pch to act differently to what would happen
normally.  Extremely smart pch - can probably get round some of these
issues, but (last time I thought I had a clue about this stuff) it doesnt
seem that in this case 'extremely smart' describes the pch stuff.

here comes even more supposition: (NB - i'm just guessing, even if i dont
quite sound like it)
i assume your pch was created just by using g++ stdc++.h - where stdc++.h
#includes all the standard headers.
therefore other then <internal> - theres no #defines in its creation
environment.
Therefore you can't use it after you've defined anything.
thats why the -include method works best, because it generally matches the
creation environment, without thinking.

Gareth

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: more pch questions
  2003-03-12  7:22   ` Benjamin Kosnik
  2003-03-12  7:46     ` Gareth Pearce
@ 2003-03-12 20:08     ` Geoff Keating
  2003-03-12 20:09       ` Daniel Jacobowitz
  1 sibling, 1 reply; 8+ messages in thread
From: Geoff Keating @ 2003-03-12 20:08 UTC (permalink / raw)
  To: Benjamin Kosnik; +Cc: gcc, gcc-patches

Benjamin Kosnik <bkoz@redhat.com> writes:

> -Winvalid-pch says nothing because in _cpp_begin_message, 
> 
>   switch (level)
>     {
>     case DL_WARNING:
>     case DL_PEDWARN:
>       if (CPP_IN_SYSTEM_HEADER (pfile)
> 	  && ! CPP_OPTION (pfile, warn_system_headers))
> 	return 0;
> 
> returns zero, because the pch in question includes files marked as
> system headers (C++ <string>) and I didn't specify 
> 
>  -Winvalid-pch -Wsystem-headers
> 
> When I do, I get:
> 
> In file included from test_pch.cc:1:
> /mnt/hd/bld/gcc/i686-pc-linux-gnu/libstdc++-v3/include/string:45:20:
> warning:
> /mnt/hd/bld/gcc/i686-pc-linux-gnu/libstdc++-v3/include/stdc++.h.gch: not
> used because `_CPP_STRING' is defined 
> 
> Perhaps a better way of getting this message would be to use DL_WARNING_SYSHDR,
> not DL_WARNING in cpp_valid_state. See attached patch. There are other,
> perhaps unrelated problems with pch files and system headers (see
> other/9471).
> 
> I'm still not quite sure what the error message, when I can see it,
> means. Any insights? Why does _CPP_STRING being defined matter?

It means that somewhere in the header you've precompiled, _CPP_STRING
is used; and that you're defining _CPP_STRING on the command line (or
before the PCH is included) when you're using the PCH but not when
generating it.  This changes the meaning of the PCH in a way that can't be
easily handled, so to ensure correct compilation, the PCH isn't used.

> Since the generated pch file is invalid, I'll try to fix this as well.

This patch is OK, please commit it.

> -benjamin
> 
> 2003-03-11  Benjamin Kosnik  <bkoz@redhat.com>
> 
> 	* cpppch.c (cpp_valid_state): Use DL_WARNING_SYSHDR, not
> 	DL_WARNING so that errors in system includes are shown.
> 
> Index: cpppch.c
> ===================================================================
> RCS file: /cvs/gcc/gcc/gcc/cpppch.c,v
> retrieving revision 1.2
> diff -c -p -r1.2 cpppch.c
> *** cpppch.c	10 Jan 2003 02:21:59 -0000	1.2
> --- cpppch.c	12 Mar 2003 04:50:47 -0000
> *************** cpp_valid_state (r, name, fd)
> *** 417,423 ****
>   	  || h->flags & NODE_POISONED)
>   	{
>   	  if (CPP_OPTION (r, warn_invalid_pch))
> ! 	    cpp_error (r, DL_WARNING,
>   		       "%s: not used because `%.*s' not defined",
>   		       name, m.name_length, namebuf);
>   	  goto fail;
> --- 417,423 ----
>   	  || h->flags & NODE_POISONED)
>   	{
>   	  if (CPP_OPTION (r, warn_invalid_pch))
> ! 	    cpp_error (r, DL_WARNING_SYSHDR,
>   		       "%s: not used because `%.*s' not defined",
>   		       name, m.name_length, namebuf);
>   	  goto fail;
> *************** cpp_valid_state (r, name, fd)
> *** 429,435 ****
>   	  || memcmp (namebuf, newdefn, m.definition_length) != 0)
>   	{
>   	  if (CPP_OPTION (r, warn_invalid_pch))
> ! 	    cpp_error (r, DL_WARNING, 
>   	       "%s: not used because `%.*s' defined as `%s' not `%.*s'",
>   		       name, m.name_length, namebuf, newdefn + m.name_length,
>   		       m.definition_length - m.name_length,
> --- 429,435 ----
>   	  || memcmp (namebuf, newdefn, m.definition_length) != 0)
>   	{
>   	  if (CPP_OPTION (r, warn_invalid_pch))
> ! 	    cpp_error (r, DL_WARNING_SYSHDR,
>   	       "%s: not used because `%.*s' defined as `%s' not `%.*s'",
>   		       name, m.name_length, namebuf, newdefn + m.name_length,
>   		       m.definition_length - m.name_length,
> *************** cpp_valid_state (r, name, fd)
> *** 454,460 ****
>   	  || h->flags & NODE_POISONED)
>   	{
>   	  if (CPP_OPTION (r, warn_invalid_pch))
> ! 	    cpp_error (r, DL_WARNING, "%s: not used because `%s' is defined",
>   		       name, undeftab + i);
>   	  goto fail;
>   	}
> --- 454,461 ----
>   	  || h->flags & NODE_POISONED)
>   	{
>   	  if (CPP_OPTION (r, warn_invalid_pch))
> ! 	    cpp_error (r, DL_WARNING_SYSHDR, 
> ! 		       "%s: not used because `%s' is defined",
>   		       name, undeftab + i);
>   	  goto fail;
>   	}
> 

-- 
- Geoffrey Keating <geoffk@geoffk.org>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: more pch questions
  2003-03-12 20:08     ` Geoff Keating
@ 2003-03-12 20:09       ` Daniel Jacobowitz
  0 siblings, 0 replies; 8+ messages in thread
From: Daniel Jacobowitz @ 2003-03-12 20:09 UTC (permalink / raw)
  To: Geoff Keating; +Cc: Benjamin Kosnik, gcc

On Wed, Mar 12, 2003 at 11:20:23AM -0800, Geoff Keating wrote:
> Benjamin Kosnik <bkoz@redhat.com> writes:
> 
> > -Winvalid-pch says nothing because in _cpp_begin_message, 
> > 
> >   switch (level)
> >     {
> >     case DL_WARNING:
> >     case DL_PEDWARN:
> >       if (CPP_IN_SYSTEM_HEADER (pfile)
> > 	  && ! CPP_OPTION (pfile, warn_system_headers))
> > 	return 0;
> > 
> > returns zero, because the pch in question includes files marked as
> > system headers (C++ <string>) and I didn't specify 
> > 
> >  -Winvalid-pch -Wsystem-headers
> > 
> > When I do, I get:
> > 
> > In file included from test_pch.cc:1:
> > /mnt/hd/bld/gcc/i686-pc-linux-gnu/libstdc++-v3/include/string:45:20:
> > warning:
> > /mnt/hd/bld/gcc/i686-pc-linux-gnu/libstdc++-v3/include/stdc++.h.gch: not
> > used because `_CPP_STRING' is defined 
> > 
> > Perhaps a better way of getting this message would be to use DL_WARNING_SYSHDR,
> > not DL_WARNING in cpp_valid_state. See attached patch. There are other,
> > perhaps unrelated problems with pch files and system headers (see
> > other/9471).
> > 
> > I'm still not quite sure what the error message, when I can see it,
> > means. Any insights? Why does _CPP_STRING being defined matter?
> 
> It means that somewhere in the header you've precompiled, _CPP_STRING
> is used; and that you're defining _CPP_STRING on the command line (or
> before the PCH is included) when you're using the PCH but not when
> generating it.  This changes the meaning of the PCH in a way that can't be
> easily handled, so to ensure correct compilation, the PCH isn't used.

Which presents the answer to Ben's problem.  Ben, I bet you're
including the PCH inside of the macro guards for the file, and it wants
to be outside.


-- 
Daniel Jacobowitz
MontaVista Software                         Debian GNU/Linux Developer

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: more pch questions
  2003-03-11  6:46 Benjamin Kosnik
@ 2003-03-11 19:04 ` Geoffrey Keating
  0 siblings, 0 replies; 8+ messages in thread
From: Geoffrey Keating @ 2003-03-11 19:04 UTC (permalink / raw)
  To: Benjamin Kosnik; +Cc: gcc


On Monday, March 10, 2003, at 09:25  PM, Benjamin Kosnik wrote:

>
> Geoff.
>
> I'm debugging cc1plus when compiling the following
>
> % cat > test.cc
> #include <string>
> #include <vector>
>
> This is with the stdc++.h.gch patch as pointed out before, and a
> generated stdc++.h.gch that seems to be valid, and in the correct place
> as far as the search path.
>
> It looks like the stdc++.h.gch file is indeed found (open_file_pch), 
> but
> ruled invalid in cpp_valid_state.
>
> (gdb) f
> #0  cpp_valid_state (r=0x85b8000, name=0xbfffdedc 
> "/mnt/hd/bld/gcc/i686-pc-linux-gnu/libstdc++-v3/include/stdc++.h.gch", 
> fd=7) at /mnt/hd/src/gcc/gcc/cpppch.c:474
>
> at the "lose" part of the function cpp_valid_state, ie cpppch.c: 473
>
>  fail:
>   if (namebuf != NULL)
>     free (namebuf);
>   if (undeftab != NULL)
>     free (undeftab);
>   return 1;
>
> (gdb) p namebuf
> $54 = (unsigned char *) 0x85c7d28 "__GNUG__ 3EXP__ 1024 
> 148623157e+308e-4932L"
>
> Is this a simple case of __GNUC__ vs __GNUG__ ??

Try using '-Winvalid-pch'.  This will give you a human-readable message 
rather than having to use GDB.

--  
Geoff Keating <geoffk@apple.com>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* more pch questions
@ 2003-03-11  6:46 Benjamin Kosnik
  2003-03-11 19:04 ` Geoffrey Keating
  0 siblings, 1 reply; 8+ messages in thread
From: Benjamin Kosnik @ 2003-03-11  6:46 UTC (permalink / raw)
  To: gcc; +Cc: geoffk


Geoff. 

I'm debugging cc1plus when compiling the following

% cat > test.cc
#include <string>
#include <vector>

This is with the stdc++.h.gch patch as pointed out before, and a
generated stdc++.h.gch that seems to be valid, and in the correct place
as far as the search path.

It looks like the stdc++.h.gch file is indeed found (open_file_pch), but
ruled invalid in cpp_valid_state.

(gdb) f
#0  cpp_valid_state (r=0x85b8000, name=0xbfffdedc "/mnt/hd/bld/gcc/i686-pc-linux-gnu/libstdc++-v3/include/stdc++.h.gch", fd=7) at /mnt/hd/src/gcc/gcc/cpppch.c:474

at the "lose" part of the function cpp_valid_state, ie cpppch.c: 473

 fail:
  if (namebuf != NULL)
    free (namebuf);
  if (undeftab != NULL)
    free (undeftab);
  return 1;

(gdb) p namebuf
$54 = (unsigned char *) 0x85c7d28 "__GNUG__ 3EXP__ 1024 148623157e+308e-4932L"

Is this a simple case of __GNUC__ vs __GNUG__ ??

-benjamin

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2003-03-12 20:08 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-03-11 19:05 more pch questions Benjamin Kosnik
2003-03-11 19:29 ` Geoffrey Keating
2003-03-12  7:22   ` Benjamin Kosnik
2003-03-12  7:46     ` Gareth Pearce
2003-03-12 20:08     ` Geoff Keating
2003-03-12 20:09       ` Daniel Jacobowitz
  -- strict thread matches above, loose matches on Subject: below --
2003-03-11  6:46 Benjamin Kosnik
2003-03-11 19:04 ` Geoffrey Keating

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).