[llvm-dev] asan for allocas on powerpc64

Yury Gribov via llvm-dev llvm-dev at lists.llvm.org
Fri Nov 13 02:20:10 PST 2015


Thanks for the investigation, we'll check on Monday.

On 11/12/2015 11:44 PM, Kostya Serebryany wrote:
> +Maxim and Yuri, as I think this is their code.
>
> On Thu, Nov 12, 2015 at 3:02 AM, Jay Foad <jay.foad at gmail.com> wrote:
>
>> (Resending with the correct mailing list address.)
>>
>> Hi,
>>
>> 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?
>>
>> Thanks,
>> Jay.
>>
>



More information about the llvm-dev mailing list