Skip to content

Commit

Permalink
[Coroutine] Remove the '!func_sanitize' metadata for split functions
Browse files Browse the repository at this point in the history
There is no proper RTTI for these split functions. So just delete the
metadata.

Fixes #49689.

Reviewed By: rjmccall

Differential Revision: https://reviews.llvm.org/D116130
  • Loading branch information
Yuanfang Chen committed Jun 27, 2022
1 parent 6678f8e commit e2e9e70
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 5 deletions.
6 changes: 6 additions & 0 deletions llvm/lib/Transforms/Coroutines/CoroSplit.cpp
Expand Up @@ -926,6 +926,12 @@ void CoroCloner::create() {
NewF->setVisibility(savedVisibility);
NewF->setUnnamedAddr(savedUnnamedAddr);
NewF->setDLLStorageClass(savedDLLStorageClass);
// The function sanitizer metadata needs to match the signature of the
// function it is being attached to. However this does not hold for split
// functions here. Thus remove the metadata for split functions.
if (Shape.ABI == coro::ABI::Switch &&
NewF->hasMetadata(LLVMContext::MD_func_sanitize))
NewF->eraseMetadata(LLVMContext::MD_func_sanitize);

// Replace the attributes of the new function:
auto OrigAttrs = NewF->getAttributes();
Expand Down
12 changes: 7 additions & 5 deletions llvm/test/Transforms/Coroutines/coro-split-00.ll
@@ -1,7 +1,7 @@
; Tests that coro-split pass splits the coroutine into f, f.resume and f.destroy
; RUN: opt < %s -passes='cgscc(coro-split),simplifycfg,early-cse' -S | FileCheck %s

define i8* @f() presplitcoroutine {
define i8* @f() presplitcoroutine !func_sanitize !0 {
entry:
%id = call token @llvm.coro.id(i32 0, i8* null, i8* null, i8* null)
%need.alloc = call i1 @llvm.coro.alloc(token %id)
Expand Down Expand Up @@ -32,7 +32,7 @@ suspend:
ret i8* %hdl
}

; CHECK-LABEL: @f(
; CHECK-LABEL: @f() !func_sanitize !0 {
; CHECK: call i8* @malloc
; CHECK: @llvm.coro.begin(token %id, i8* %phi)
; CHECK: store void (%f.Frame*)* @f.resume, void (%f.Frame*)** %resume.addr
Expand All @@ -43,21 +43,21 @@ suspend:
; CHECK-NOT: call void @free(
; CHECK: ret i8* %hdl

; CHECK-LABEL: @f.resume(
; CHECK-LABEL: @f.resume({{.*}}) {
; CHECK-NOT: call i8* @malloc
; CHECK-NOT: call void @print(i32 0)
; CHECK: call void @print(i32 1)
; CHECK-NOT: call void @print(i32 0)
; CHECK: call void @free(
; CHECK: ret void

; CHECK-LABEL: @f.destroy(
; CHECK-LABEL: @f.destroy({{.*}}) {
; CHECK-NOT: call i8* @malloc
; CHECK-NOT: call void @print(
; CHECK: call void @free(
; CHECK: ret void

; CHECK-LABEL: @f.cleanup(
; CHECK-LABEL: @f.cleanup({{.*}}) {
; CHECK-NOT: call i8* @malloc
; CHECK-NOT: call void @print(
; CHECK-NOT: call void @free(
Expand All @@ -77,3 +77,5 @@ declare i1 @llvm.coro.end(i8*, i1)
declare noalias i8* @malloc(i32)
declare void @print(i32)
declare void @free(i8*) willreturn

!0 = !{i32 846595819, i8** null}

0 comments on commit e2e9e70

Please sign in to comment.