delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp-workers/1999/06/08/03:44:13

From: Andris Pavenis <andris AT stargate DOT astr DOT lu DOT lv>
Organization: AI LU
To: djgpp-workers AT delorie DOT com
Subject: Re: problem with data alignment with egcs-19990602
Date: Tue, 8 Jun 1999 10:27:08 +0000
X-Mailer: KMail [version 1.0.21]
Cc: egcs-bugs AT egcs DOT cygnus DOT com
References: <99060717171200 DOT 00403 AT hal>
MIME-Version: 1.0
Message-Id: <99060810411500.00968@hal>
Reply-To: djgpp-workers AT delorie DOT com

Problem seems to be related with use of #pragma pack():
	I had to put definition of some structures between
		#pragma pack(1)
	and
		#pragma pack()

It looks that with gcc 2.95 tree the second line (#pragma pack())
is ignored and as result I'm getting wrong code.
	- using __attribute__(packed) instead fixes the problem
	- no changes needed for egcs-1.1.2 (#pragma pack() works
	   as I expect)

Below is simple test example that ilustrates the problem

----------------------------------------------------
#include <stdio.h>
#include <assert.h>


#pragma pack(1)
#pragma pack()


class  Test1
  {
  public:
      char a;
      long b;
      Test1 (void)
        {
	    printf ("%p\n",(((char *) & b)-((char *) & a)));
	}
  };
  
  
int main (void)
  {
      Test1 x;
      return 0;
  }
  
----------------------------------------------------		
With gcc-1.1.2 I'm getting output 4
With gcc-2.95 prerelease I'm getting 1

So we should either have a warning from compiler that #pragma pack()
should not be used or this problem must be fixed

Andris


On Mon, 07 Jun 1999, Andris Pavenis wrote:
> On Mon, 07 Jun 1999, pavenis AT lanet DOT lv wrote:
> > 	compiler generates code which access class member
> > 	via wrong address (result is SIGSEGV for me). Below is 		
> > 	some test data I got (I simply copied this from rhide watch 
> > 	window and added some comments)
> > 
> >  this: (TEphApp *) 0x240f20
> >  App: (TEphApp *) 0x240f20
> >  &slrcfg: (LoadedConfigFile *) 0x240f84
> >  &App->slrcfg: (LoadedConfigFile *) 0x240f84
> >  &satinfo: (LoadedConfigFile *) 0x240fa5             - false address 
> > 	 (but this address is used both when I call satinfo.foo() and
> > 	App->satinfo.foo() (name changed) from member function)
> >  &(App->satinfo): (LoadedConfigFile *) 0x240fa8   - right value (I can 
> >       get contents here)
> > 
> > I have this problem in rather big application (TVision + different 
> > other stuff, TEphApp is derived from TApplication such stuff as
> > virtual base classes etc is present) only.
> > 
> > I tried to reproduce this problem in a simple test example but didn't 
> > succeed. Perhaps I'll check the same sometime under Linux as this
> > app can be built (and it should normally work) also under Linux.
> > 
> 
> I reproduced the same thing with egcs-19990601 (I updated gcc 2.95
> branch with CVS then) under Linux (kernel 2.2.9, glibc-2.1.1). 
> As I don't have good test example to send then perhaps I'll retry the same
> with later snapshots. Perhaps it would be worth to try also with
> gcc-2.96 tree to see whether something changes.
> 
> Andris

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019