Author: Aditya Kumar
Date: 2021-10-08T17:54:44-07:00
New Revision: 0f00aa502d79acf8a92b0b8490489895a9f28829

URL: 
https://github.com/llvm/llvm-project/commit/0f00aa502d79acf8a92b0b8490489895a9f28829
DIFF: 
https://github.com/llvm/llvm-project/commit/0f00aa502d79acf8a92b0b8490489895a9f28829.diff

LOG: Add no_instrument_function attribute to Objective C methods as well

There are functions where we do not want function instrumentation which is why 
we have `__attribute__((no_instrument_function))`. Extending this functionality 
to disable instrumentation for Objective-C methods as well. Objective C methods 
like `+load` run premain and having instrumentation on them causes runtime 
errors depending on the implementation of `__cyg_profile_func_enter` etc. 
functions

Reviewed By: rjmccall, aaron.ballman

Differential Revision: https://reviews.llvm.org/D111286

Added: 
    clang/test/CodeGen/instrument-objc-method.m
    clang/test/SemaObjC/attr-noinstrument.m

Modified: 
    clang/include/clang/Basic/Attr.td
    clang/test/Misc/pragma-attribute-supported-attributes-list.test

Removed: 
    


################################################################################
diff  --git a/clang/include/clang/Basic/Attr.td 
b/clang/include/clang/Basic/Attr.td
index 00e847bc5d2fb..ec7c1bd60ed4c 100644
--- a/clang/include/clang/Basic/Attr.td
+++ b/clang/include/clang/Basic/Attr.td
@@ -1979,7 +1979,7 @@ def NoReturn : InheritableAttr {
 
 def NoInstrumentFunction : InheritableAttr {
   let Spellings = [GCC<"no_instrument_function">];
-  let Subjects = SubjectList<[Function]>;
+  let Subjects = SubjectList<[Function, ObjCMethod]>;
   let Documentation = [Undocumented];
   let SimpleHandler = 1;
 }

diff  --git a/clang/test/CodeGen/instrument-objc-method.m 
b/clang/test/CodeGen/instrument-objc-method.m
new file mode 100644
index 0000000000000..12d1ab957e964
--- /dev/null
+++ b/clang/test/CodeGen/instrument-objc-method.m
@@ -0,0 +1,34 @@
+// RUN: %clang_cc1 -S -triple x86_64-apple-darwin10 
-debug-info-kind=standalone -emit-llvm -o - %s -finstrument-functions | 
FileCheck %s
+// RUN: %clang_cc1 -S -triple x86_64-apple-darwin10 
-debug-info-kind=standalone -emit-llvm -o - %s -finstrument-function-entry-bare 
| FileCheck -check-prefix=BARE %s
+
+@interface ObjCClass
+@end
+
+@implementation ObjCClass
+
+// CHECK: @"\01+[ObjCClass initialize]"
+// CHECK: call void @__cyg_profile_func_enter
+// CHECK: call void @__cyg_profile_func_exit
+// BARE: @"\01+[ObjCClass initialize]"
+// BARE: call void @__cyg_profile_func_enter
++ (void)initialize {
+}
+
+// CHECK: @"\01+[ObjCClass load]"
+// CHECK-NOT: call void @__cyg_profile_func_enter
+// BARE: @"\01+[ObjCClass load]"
+// BARE-NOT: call void @__cyg_profile_func_enter
++ (void)load __attribute__((no_instrument_function)) {
+}
+
+// CHECK: @"\01-[ObjCClass dealloc]"
+// CHECK-NOT: call void @__cyg_profile_func_enter
+// BARE: @"\01-[ObjCClass dealloc]"
+// BARE-NOT: call void @__cyg_profile_func_enter
+- (void)dealloc __attribute__((no_instrument_function)) {
+}
+
+// CHECK: declare void @__cyg_profile_func_enter(i8*, i8*)
+// CHECK: declare void @__cyg_profile_func_exit(i8*, i8*)
+// BARE: declare void @__cyg_profile_func_enter_bare
+@end

diff  --git a/clang/test/Misc/pragma-attribute-supported-attributes-list.test 
b/clang/test/Misc/pragma-attribute-supported-attributes-list.test
index 8ea6dc45c9479..ef08ad89ff8c6 100644
--- a/clang/test/Misc/pragma-attribute-supported-attributes-list.test
+++ b/clang/test/Misc/pragma-attribute-supported-attributes-list.test
@@ -98,7 +98,7 @@
 // CHECK-NEXT: NoDuplicate (SubjectMatchRule_function)
 // CHECK-NEXT: NoEscape (SubjectMatchRule_variable_is_parameter)
 // CHECK-NEXT: NoInline (SubjectMatchRule_function)
-// CHECK-NEXT: NoInstrumentFunction (SubjectMatchRule_function)
+// CHECK-NEXT: NoInstrumentFunction (SubjectMatchRule_function, 
SubjectMatchRule_objc_method)
 // CHECK-NEXT: NoMerge (SubjectMatchRule_function)
 // CHECK-NEXT: NoMicroMips (SubjectMatchRule_function)
 // CHECK-NEXT: NoMips16 (SubjectMatchRule_function)

diff  --git a/clang/test/SemaObjC/attr-noinstrument.m 
b/clang/test/SemaObjC/attr-noinstrument.m
new file mode 100644
index 0000000000000..1ba3a6753bc26
--- /dev/null
+++ b/clang/test/SemaObjC/attr-noinstrument.m
@@ -0,0 +1,22 @@
+// RUN: %clang_cc1 -fsyntax-only -triple x86_64-apple-darwin10.4 -verify 
-Wno-objc-root-class %s
+// RUN: %clang_cc1 -x objective-c++ -fsyntax-only -triple 
x86_64-apple-darwin10.4 -verify -Wno-objc-root-class %s
+
+// expected-no-diagnostics
+@interface A
++ (void)F __attribute__((no_instrument_function)); // no warning
+- (void)f __attribute__((objc_direct, no_instrument_function));
+- (void)g;
+@end
+
+@implementation A
++ (void)F __attribute__((no_instrument_function)) {
+  [self F];
+}
+
+- (void)f {
+  [self g];
+}
+
+- (void)g {
+}
+@end


        
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to