Skip to content
  • Brian Gesiak's avatar
    [Coroutines] Schedule coro-split before asan · 91a4b5af
    Brian Gesiak authored
    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`.
    
    Reviewers: GorNishanov, lewissbaker, EricWF
    
    Reviewed By: GorNishanov
    
    Subscribers: cfe-commits
    
    Differential Revision: https://reviews.llvm.org/D43927
    
    llvm-svn: 328951
    91a4b5af
Loading