[llvm-dev] workaround for CoroSplit not spilling alloca?
Andrew Kelley via llvm-dev
llvm-dev at lists.llvm.org
Wed Mar 28 22:19:44 PDT 2018
My frontend is emitting an array (here called
%error_return_trace_addresses). You can see we take the address of the
first element and store it
; Function Attrs: nobuiltin noinline nounwind optnone
define internal fastcc i8* @failing(%StackTrace* nonnull, %Allocator*,
i16*) unnamed_addr #3 !dbg !273 {
Entry:
%error_return_trace_addresses = alloca [1 x i64], align 8
%error_return_trace = alloca %StackTrace, align 8
%3 = alloca i8*, align 8
%4 = alloca %"[]u8", align 8
%5 = getelementptr inbounds %StackTrace, %StackTrace*
%error_return_trace, i32 0, i32 0
store i64 0, i64* %5, align 8
%6 = getelementptr inbounds %StackTrace, %StackTrace*
%error_return_trace, i32 0, i32 1
%7 = getelementptr inbounds %"[]usize", %"[]usize"* %6, i32 0, i32 0
%8 = getelementptr inbounds [1 x i64], [1 x i64]*
%error_return_trace_addresses, i64 0, i64 0
store i64* %8, i64** %7, align 8
however CoroSplit does not spill it.
we write through the pointer, which writes to the fn stack data.
then there is a suspend point, and the data becomes corrupt.
then we read through the pointer and get corrupt data.
this is because %error_return_trace_addresses should be spilled.
is there a way for a frontend to explicitly require an alloca to be
spilled? perhaps putting it as a field in the promise alloca?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20180329/06cd28be/attachment.html>
More information about the llvm-dev
mailing list