[LLVMbugs] [Bug 22115] PPC32: Base pointer clobbered with -fPIC

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Thu Jan 8 14:53:53 PST 2015


http://llvm.org/bugs/show_bug.cgi?id=22115

Marcus Comstedt <marcus at mc.pp.se> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|RESOLVED                    |REOPENED
         Resolution|FIXED                       |---

--- Comment #5 from Marcus Comstedt <marcus at mc.pp.se> ---
Hi.

Thanks.  I tried the fix, but it doesn't seem quite correct yet.

r30 is now saved in the stack frame, but the size of the stack frame is not
increased, so the saved value now overlaps another value?!

The code generated for foo() is now:

foo:
    mflr 0
    stw 31, -4(1)
    stw 30, -8(1)
    stw 0, 4(1)
    stwu 1, -16(1)
    mr 31, 1
    bl .L0$pb
.L0$pb:
    mflr 30
    lwz 3, .L0$poff-.L0$pb(30)
    add 30, 3, 30
    lwz 3, .LC1-.L.TOC.(30)
    lwz 3, 0(3)
    lwz 4, .LC3-.L.TOC.(30)
    crxor 6, 6, 6
    bl fprintf at PLT
    li 4, 0
    stw 3, 8(31)
    mr 3, 4
    addi 1, 1, 16
    lwz 0, 4(1)
    lwz 31, -4(1)
    lwz 30, -8(1)
    mtlr 0
    blr

So r30 is saved at -8(1), which is 8(31).  But this is also where the return
value of fprintf() is stored!  So on return r30 will have the value 4 (giving
a segfault)...

Am I missing something here?  I was only able to apply the patch to
PPCFrameLowering.cpp because the change to PPCISelDAGToDAG.cpp concerns small
pic which is not included in 3.5.0...

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20150108/87f7fbbc/attachment.html>


More information about the llvm-bugs mailing list