nickdesaulniers created this revision. nickdesaulniers added reviewers: MaskRay, melver, void. Herald added a subscriber: wenlei. nickdesaulniers requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
noprofile IR attribute already exists to prevent profiling with PGO; emit that when a function uses the no_instrument_function function attribute. The Linux kernel would like to avoid compiler generated code in functions annotated with such attribute. We already respect this for libcalls to fentry() and mcount(). Link: https://lore.kernel.org/lkml/cakwvodmpti93n2l0_yqkrzldmpxzror7zggszonyaw2pgsh...@mail.gmail.com/ Signed-off-by: Nick Desaulniers <ndesaulni...@google.com> Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D104253 Files: clang/lib/CodeGen/CodeGenFunction.cpp clang/test/CodeGen/fprofile-generate.c Index: clang/test/CodeGen/fprofile-generate.c =================================================================== --- /dev/null +++ clang/test/CodeGen/fprofile-generate.c @@ -0,0 +1,22 @@ +// RUN: %clang_cc1 -fprofile-instrument=llvm -emit-llvm -o - %s | FileCheck %s +int g(int); + +int __attribute__((__no_instrument_function__)) +__attribute__((no_instrument_function)) +no_instr(int a) { +// CHECK: define {{.*}} i32 @no_instr(i32 %a) [[ATTR:#[0-9]+]] + int sum = 0; + for (int i = 0; i < a; i++) + sum += g(i); + return sum; +} + +int instr(int a) { +// CHECK: define {{.*}} i32 @instr(i32 %a) [[ATTR2:#[0-9]+]] + int sum = 0; + for (int i = 0; i < a; i++) + sum += g(i); + return sum; +} +// CHECK: attributes [[ATTR]] = {{.*}} noprofile +// CHECK-NOT: attributes [[ATTR2]] = {{.*}} noprofile Index: clang/lib/CodeGen/CodeGenFunction.cpp =================================================================== --- clang/lib/CodeGen/CodeGenFunction.cpp +++ clang/lib/CodeGen/CodeGenFunction.cpp @@ -893,6 +893,9 @@ if (D && D->hasAttr<CFICanonicalJumpTableAttr>()) Fn->addFnAttr("cfi-canonical-jump-table"); + if (D && D->hasAttr<NoInstrumentFunctionAttr>()) + Fn->addFnAttr(llvm::Attribute::NoProfile); + if (getLangOpts().OpenCL) { // Add metadata for a kernel function. if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D))
Index: clang/test/CodeGen/fprofile-generate.c =================================================================== --- /dev/null +++ clang/test/CodeGen/fprofile-generate.c @@ -0,0 +1,22 @@ +// RUN: %clang_cc1 -fprofile-instrument=llvm -emit-llvm -o - %s | FileCheck %s +int g(int); + +int __attribute__((__no_instrument_function__)) +__attribute__((no_instrument_function)) +no_instr(int a) { +// CHECK: define {{.*}} i32 @no_instr(i32 %a) [[ATTR:#[0-9]+]] + int sum = 0; + for (int i = 0; i < a; i++) + sum += g(i); + return sum; +} + +int instr(int a) { +// CHECK: define {{.*}} i32 @instr(i32 %a) [[ATTR2:#[0-9]+]] + int sum = 0; + for (int i = 0; i < a; i++) + sum += g(i); + return sum; +} +// CHECK: attributes [[ATTR]] = {{.*}} noprofile +// CHECK-NOT: attributes [[ATTR2]] = {{.*}} noprofile Index: clang/lib/CodeGen/CodeGenFunction.cpp =================================================================== --- clang/lib/CodeGen/CodeGenFunction.cpp +++ clang/lib/CodeGen/CodeGenFunction.cpp @@ -893,6 +893,9 @@ if (D && D->hasAttr<CFICanonicalJumpTableAttr>()) Fn->addFnAttr("cfi-canonical-jump-table"); + if (D && D->hasAttr<NoInstrumentFunctionAttr>()) + Fn->addFnAttr(llvm::Attribute::NoProfile); + if (getLangOpts().OpenCL) { // Add metadata for a kernel function. if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D))
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits