[llvm-dev] asan for allocas on powerpc64
Yury Gribov via llvm-dev
llvm-dev at lists.llvm.org
Wed Nov 18 09:44:31 PST 2015
On 11/18/2015 12:12 AM, 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.
Another option is provide a builtin function like getDynamicAreaOffset()
(to be lowered in backends).
> I don't know if this would cause other problems, or if it would be
> acceptable to the target maintainers.
More information about the llvm-dev
mailing list