On Mon, Jun 20, 2005 at 07:57:17PM +0400, Sergei Organov wrote:
> Andrew Pinski <[EMAIL PROTECTED]> writes:
> 
> > On Jun 20, 2005, at 11:28 AM, Sergei Organov wrote:
> > 
> > > Andrew Pinski <[EMAIL PROTECTED]> writes:
> > >
> > >> On Jun 20, 2005, at 10:54 AM, Sergei Organov wrote:
> > >>
> > >>> so SYMBOL_FLAG_SMALL (flags 0x6 vs 0x2) is somehow being missed when -O1
> > 
> > >>
> > >>> is turned on. Seems to be something at tree-to-RTX conversion time.
> > >>> Constant folding?
> > >>
> > >> No, it would mean that the target says that this is not a small data.
> > >> Also try it with the following code and you will see there is no
> > >> difference:
> > 
> > >>
> > >>          double osvf() { return 314314314; }
> > >
> > > There is no difference in the sense that here both -O0 and -O1 behave
> > > roughly the same. So the problem is with detecting "smallness" for true
> > > constants by the target, right?
> > 
> > I think the bug is in rs6000_elf_in_small_data_p but since I have not
> > debuged it yet I don't know for sure.
> > 
> > Could you file a bug?  This is a target bug.
> 
> Yeah, and I've reported it rather long ago against gcc-3.3 (PR 9571).
> That time there were 3 problems reported in the PR of which only the
> first one seems to be fixed (or are the rest just re-appeared in 4.0?).
> 
> I think PR 9571 is in fact regression with respect to 2.95.x despite the
> [wrong] comments:
> 
> ------- Additional Comment #5 From Franz Sirl  2003-06-17 15:31  [reply] 
> -------
> 
> r0 is used as a pointer to sdata2, this is a bug, it should be r2. And
> since only r2 is initialized in the ecrt*.o files, how can this work?
> Besides that, even if you initialize r0 manually, it is practically
> clobbered in about every function.

It's been a long time since I've hacked the PowerPC, but IIRC the instruction
set, a base register of '0' does not mean r0, but instead it means use 0 as the
base address.  Every place that uses a base register should use the register
class 'b' (BASE_REGS) instead of 'r' (GENERAL_REGS), which excludes r0 from
being considered.

Under the 32-bit eABI calling sequence, you have three small data areas:

The small data area that r2 points to (.sdata/.sbss).

The small data area that r13 points to (.sdata2/.sbss2).

The small data area centered around location 0 (ie, small positive addresses,
and the most negative addresses).  I don't recall that we had special sections
for this, since for many embedded apps, they couldn't allocate to those
addresses.

For these relocations, you should use R_PPC_EMB_SDA21, which the linker will
fill in both the offset and the appropriate base register into the instruction.

> ------- Additional Comment #6 From Mark Mitchell  2003-07-20 00:52  [reply] 
> -------
> 
> Based on Franz's comments, this bug is not really a regression at all.
> I've therefore removed the regression tags.
> 
> that I've tried to explain in my comment #7.
> 
> I don't think I need to file yet another PR in this situation, right?
> 
> -- 
> Sergei.
> 

-- 
Michael Meissner
email: [EMAIL PROTECTED]
http://www.the-meissners.org

Reply via email to