Author: Sami Tolvanen Date: 2023-07-07T16:50:30Z New Revision: 930635271f810316f48bd1aa78935acf36a08f8f
URL: https://github.com/llvm/llvm-project/commit/930635271f810316f48bd1aa78935acf36a08f8f DIFF: https://github.com/llvm/llvm-project/commit/930635271f810316f48bd1aa78935acf36a08f8f.diff LOG: [Clang] Emit KCFI type hashes for member functions With `-fsanitize=kcfi`, Clang currently won't emit type hashes for C++ member functions, which leads to check failures if they are indirectly called. As there's no reason to exclude member functions in CodeGenModule::setKCFIType, emit type hashes also for them to fix member function pointer calls with KCFI, and add a test to confirm that types are emitted correctly. Added: Modified: clang/lib/CodeGen/CodeGenModule.cpp clang/test/CodeGen/kcfi.c Removed: ################################################################################ diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 6ea499958695d4..b5d26395ebba6a 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -2610,9 +2610,6 @@ void CodeGenModule::CreateFunctionTypeMetadataForIcall(const FunctionDecl *FD, } void CodeGenModule::setKCFIType(const FunctionDecl *FD, llvm::Function *F) { - if (isa<CXXMethodDecl>(FD) && !cast<CXXMethodDecl>(FD)->isStatic()) - return; - llvm::LLVMContext &Ctx = F->getContext(); llvm::MDBuilder MDB(Ctx); F->setMetadata(llvm::LLVMContext::MD_kcfi_type, diff --git a/clang/test/CodeGen/kcfi.c b/clang/test/CodeGen/kcfi.c index 1adf6df92a6543..f6b2e4b398aa7c 100644 --- a/clang/test/CodeGen/kcfi.c +++ b/clang/test/CodeGen/kcfi.c @@ -1,5 +1,5 @@ // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm -fsanitize=kcfi -o - %s | FileCheck %s -// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm -fsanitize=kcfi -x c++ -o - %s | FileCheck %s +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm -fsanitize=kcfi -x c++ -o - %s | FileCheck %s --check-prefixes=CHECK,MEMBER // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm -fsanitize=kcfi -fpatchable-function-entry-offset=3 -o - %s | FileCheck %s --check-prefixes=CHECK,OFFSET #if !__has_feature(kcfi) #error Missing kcfi? @@ -54,7 +54,21 @@ int test(void) { f6(); } +#ifdef __cplusplus +struct A { + // MEMBER-DAG: define{{.*}} void @_ZN1A1fEv(ptr{{.*}} %this){{.*}} !kcfi_type ![[#TYPE3:]] + void f() {} +}; + +void test_member_call(void) { + void (A::* p)() = &A::f; + // MEMBER-DAG: call void %[[#]](ptr{{.*}} [ "kcfi"(i32 [[#%d,HASH3:]]) ] + (A().*p)(); +} +#endif + // CHECK-DAG: ![[#]] = !{i32 4, !"kcfi", i32 1} // OFFSET-DAG: ![[#]] = !{i32 4, !"kcfi-offset", i32 3} // CHECK-DAG: ![[#TYPE]] = !{i32 [[#HASH]]} // CHECK-DAG: ![[#TYPE2]] = !{i32 [[#%d,HASH2:]]} +// MEMBER-DAG: ![[#TYPE3]] = !{i32 [[#HASH3]]} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits