This is an archive of the discontinued LLVM Phabricator instance.

[Coroutines] Schedule coro-split before asan
ClosedPublic

Authored by modocache on Feb 28 2018, 8:36 PM.

Details

Summary

The docs for the LLVM coroutines intrinsic @llvm.coro.id state that
"The second argument, if not null, designates a particular alloca instruction
to be a coroutine promise."

However, if the address sanitizer pass is run before the @llvm.coro.id
intrinsic is lowered, the alloca instruction passed to the intrinsic as its
second argument is converted, as per the
https://github.com/google/sanitizers/wiki/AddressSanitizerAlgorithm docs, to
an inttoptr instruction that accesses the address of the promise.

On optimization levels -O1 and above, the -asan pass is run after
-coro-early, -coro-split, and -coro-elide, and before
-coro-cleanup, and so there is no issue. At -O0, however, -asan
is run in between -coro-early and -coro-split, which causes an
assertion to be hit when the inttoptr instruction is forcibly cast to
an alloca.

Rearrange the passes such that the coroutine passes are registered
before the sanitizer passes.

Test Plan:
Compile a simple C++ program that uses coroutines in -O0 with
-fsanitize-address, and confirm no assertion is hit:
clang++ coro-example.cpp -fcoroutines-ts -g -fsanitize=address -fno-omit-frame-pointer.

Diff Detail

Repository
rC Clang

Event Timeline

modocache created this revision.Feb 28 2018, 8:36 PM

I wasn't sure what the best way to test this would be. The assertion occurs in LLVM, but Clang is responsible for scheduling the passes. If anyone has any suggestions, I'd greatly appreciate them!

This revision is now accepted and ready to land.Mar 28 2018, 8:22 PM
This revision was automatically updated to reflect the committed changes.