[llvm-dev] asan for allocas on powerpc64

Jay Foad via llvm-dev llvm-dev at lists.llvm.org
Tue Nov 17 13:12:40 PST 2015


>>     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.


More information about the llvm-dev mailing list