[llvm-dev] asan for allocas on powerpc64
Jay Foad via llvm-dev
llvm-dev at lists.llvm.org
Mon Nov 23 05:46:20 PST 2015
In LowerGET_DYNAMIC_AREA_OFFSET() you're
calling MFI->getMaxCallFrameSize(), but it looks like that doesn't return
useful information until after the
PrologEpilogInserter's PEI::calculateCallsInformation() has run.
So maybe the lowering has to be done as part of frame index elimination?
(I'm not too familiar with this code.)
Jay.
On 23 November 2015 at 13:07, Jay Foad <jay.foad at gmail.com> wrote:
> Maxim,
>
> It seems to be doing roughly the right thing, but it isn't quite enough to
> fix the test case. getDynamicAreaOffset() is returning 0x20, but from
> looking at the generated code for the test case, the real offset from
> native sp to the allocated area is 0x60.
>
> I will run it under gdb and see if I can spot the problem...
>
> Thanks!
> Jay.
>
> On 23 November 2015 at 11:41, Maxim Ostapenko <
> m.ostapenko at partner.samsung.com> wrote:
>
>> Jay, do you have a PowerPC64 target? If so, could you please check
>> attached patch on PPC box? This is a draft patch, but it would be nice to
>> make sure that we are moving to right direction here.
>>
>> Thanks,
>> -Maxim
>>
>>
>> On 18/11/15 00:12, Jay Foad wrote:
>>
>>> Currently test/asan/TestCases/alloca_vla_interact.cc is XFAILed for
>>>>> powerpc64. I've had a look at why it doesn't work. I think the
>>>>> only
>>>>> problem is in the call to __asan_allocas_unpoison that is
>>>>> inserted at
>>>>> the end of the "for" loop (just before a stackrestore
>>>>> instruction).
>>>>>
>>>>> The call function is created something like this (paraphrasing
>>>>> from
>>>>> lib/Transfoms/Instrumentation/AddressSanitizer.cpp):
>>>>>
>>>>> // call __asan_allocas_unpoison(uptr top, uptr bottom);
>>>>> // NB "top" here means lowest address and "bottom" means
>>>>> highest!
>>>>>
>>>>> IRB.CreateCall(
>>>>> AsanAllocasUnpoisonFunc,
>>>>> {
>>>>> IRB.CreateLoad(DynamicAllocaLayout),
>>>>> IRB.CreatePointerToInt(SaveRestoreInst->getOperand(0), IntptrTy)
>>>>> }
>>>>> );
>>>>>
>>>>> I think the problem is that the operand to stackrestore is the new
>>>>> native sp register value to restore, and this code is assuming
>>>>> that
>>>>> that will be a higher address than all the allocas that are being
>>>>> unallocated. But on PowerPC64, the native sp is always lower than
>>>>> the
>>>>> address of the most recent alloca by MaxCallFrameSize bytes, to
>>>>> leave
>>>>> space for outgoing call arguments. So I think the second argument
>>>>> to
>>>>> __asan_allocas_unpoison needs to be
>>>>> SaveRestoreInst->getOperand(0) +
>>>>> MaxCallFrameSize, but I don't know how to implement that.
>>>>>
>>>>> Thoughts?
>>>>>
>>>>> Yeah, you are right, we rely on stackrestore to get "bottom" parameter
>>>> for
>>>> __asan_allocas_unpoison and indeed PowerPC64 seems to be special here.
>>>> However, right now I don't see a suitable way how to get
>>>> MaxCallFrameSize
>>>> from LLVM backend in ASan pass, investigation is in progress.
>>>>
>>> One idea I had for a solution was to change llvm.stacksave so that it
>>> *always* returned native sp + MaxCallFrameSize, and do the
>>> corresponding adjustment in llvm.stackrestore. In most cases this
>>> would just replace a mov instruction with an addi instruction.
>>>
>>> I don't know if this would cause other problems, or if it would be
>>> acceptable to the target maintainers.
>>>
>>> Jay.
>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20151123/5f721b23/attachment.html>
More information about the llvm-dev
mailing list