diff --git a/llvm/lib/Transforms/Coroutines/CoroSplit.cpp b/llvm/lib/Transforms/Coroutines/CoroSplit.cpp --- a/llvm/lib/Transforms/Coroutines/CoroSplit.cpp +++ b/llvm/lib/Transforms/Coroutines/CoroSplit.cpp @@ -926,6 +926,12 @@ 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(); diff --git a/llvm/test/Transforms/Coroutines/coro-split-00.ll b/llvm/test/Transforms/Coroutines/coro-split-00.ll --- a/llvm/test/Transforms/Coroutines/coro-split-00.ll +++ b/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) @@ -32,7 +32,7 @@ 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 @@ -43,7 +43,7 @@ ; 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) @@ -51,13 +51,13 @@ ; 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( @@ -77,3 +77,5 @@ declare noalias i8* @malloc(i32) declare void @print(i32) declare void @free(i8*) willreturn + +!0 = !{i32 846595819, i8** null}