dberris created this revision.

This change allows us to add arg1 logging support to functions through
the special case list provided through -fxray-always-instrument=. This
is useful for adding arg1 logging to functions that are either in
headers that users don't have control over (i.e. cannot change the
source) or would rather not do.

It only takes effect when the pattern is matched through the "fun:"
special case, as a category. As in:

  fun:*pattern=arg1


https://reviews.llvm.org/D33392

Files:
  include/clang/Basic/XRayLists.h
  lib/Basic/XRayLists.cpp
  lib/CodeGen/CodeGenModule.cpp
  test/CodeGen/xray-imbue-arg1.cpp


Index: test/CodeGen/xray-imbue-arg1.cpp
===================================================================
--- /dev/null
+++ test/CodeGen/xray-imbue-arg1.cpp
@@ -0,0 +1,12 @@
+// RUN: echo "fun:*arg1*=arg1" >> %t.always-instrument
+// RUN: %clang_cc1 -fxray-instrument -x c++ -std=c++11 
-fxray-always-instrument=%t.always-instrument -emit-llvm -o - %s -triple 
x86_64-unknown-linux-gnu | FileCheck %s
+
+void foo() {}
+
+void arg1(void*) {}
+
+// CHECK: define void @_Z3foov() #[[FOO:[0-9]+]] {
+// CHECK: define void {{.*}}arg1{{.*}} #[[ALWAYSARG1:[0-9]+]] {
+
+// CHECK: attributes #[[FOO]] = {{.*}}
+// CHECK: attributes #[[ALWAYSARG1]] = {{.*}} 
"function-instrument"="xray-always" {{.*}} "xray-log-args"="1"
Index: lib/CodeGen/CodeGenModule.cpp
===================================================================
--- lib/CodeGen/CodeGenModule.cpp
+++ lib/CodeGen/CodeGenModule.cpp
@@ -1508,6 +1508,10 @@
   case ImbueAttr::ALWAYS:
     Fn->addFnAttr("function-instrument", "xray-always");
     break;
+  case ImbueAttr::ALWAYS_ARG1:
+    Fn->addFnAttr("function-instrument", "xray-always");
+    Fn->addFnAttr("xray-log-args", "1");
+    break;
   case ImbueAttr::NEVER:
     Fn->addFnAttr("function-instrument", "xray-never");
     break;
Index: lib/Basic/XRayLists.cpp
===================================================================
--- lib/Basic/XRayLists.cpp
+++ lib/Basic/XRayLists.cpp
@@ -28,6 +28,8 @@
   // whether it's treated as a "never" instrument function.
   if (AlwaysInstrument->inSection("fun", FunctionName))
     return ImbueAttribute::ALWAYS;
+  if (AlwaysInstrument->inSection("fun", FunctionName, "arg1"))
+    return ImbueAttribute::ALWAYS_ARG1;
   if (NeverInstrument->inSection("fun", FunctionName))
     return ImbueAttribute::NEVER;
   return ImbueAttribute::NONE;
Index: include/clang/Basic/XRayLists.h
===================================================================
--- include/clang/Basic/XRayLists.h
+++ include/clang/Basic/XRayLists.h
@@ -37,6 +37,7 @@
     NONE,
     ALWAYS,
     NEVER,
+    ALWAYS_ARG1,
   };
 
   ImbueAttribute shouldImbueFunction(StringRef FunctionName) const;


Index: test/CodeGen/xray-imbue-arg1.cpp
===================================================================
--- /dev/null
+++ test/CodeGen/xray-imbue-arg1.cpp
@@ -0,0 +1,12 @@
+// RUN: echo "fun:*arg1*=arg1" >> %t.always-instrument
+// RUN: %clang_cc1 -fxray-instrument -x c++ -std=c++11 -fxray-always-instrument=%t.always-instrument -emit-llvm -o - %s -triple x86_64-unknown-linux-gnu | FileCheck %s
+
+void foo() {}
+
+void arg1(void*) {}
+
+// CHECK: define void @_Z3foov() #[[FOO:[0-9]+]] {
+// CHECK: define void {{.*}}arg1{{.*}} #[[ALWAYSARG1:[0-9]+]] {
+
+// CHECK: attributes #[[FOO]] = {{.*}}
+// CHECK: attributes #[[ALWAYSARG1]] = {{.*}} "function-instrument"="xray-always" {{.*}} "xray-log-args"="1"
Index: lib/CodeGen/CodeGenModule.cpp
===================================================================
--- lib/CodeGen/CodeGenModule.cpp
+++ lib/CodeGen/CodeGenModule.cpp
@@ -1508,6 +1508,10 @@
   case ImbueAttr::ALWAYS:
     Fn->addFnAttr("function-instrument", "xray-always");
     break;
+  case ImbueAttr::ALWAYS_ARG1:
+    Fn->addFnAttr("function-instrument", "xray-always");
+    Fn->addFnAttr("xray-log-args", "1");
+    break;
   case ImbueAttr::NEVER:
     Fn->addFnAttr("function-instrument", "xray-never");
     break;
Index: lib/Basic/XRayLists.cpp
===================================================================
--- lib/Basic/XRayLists.cpp
+++ lib/Basic/XRayLists.cpp
@@ -28,6 +28,8 @@
   // whether it's treated as a "never" instrument function.
   if (AlwaysInstrument->inSection("fun", FunctionName))
     return ImbueAttribute::ALWAYS;
+  if (AlwaysInstrument->inSection("fun", FunctionName, "arg1"))
+    return ImbueAttribute::ALWAYS_ARG1;
   if (NeverInstrument->inSection("fun", FunctionName))
     return ImbueAttribute::NEVER;
   return ImbueAttribute::NONE;
Index: include/clang/Basic/XRayLists.h
===================================================================
--- include/clang/Basic/XRayLists.h
+++ include/clang/Basic/XRayLists.h
@@ -37,6 +37,7 @@
     NONE,
     ALWAYS,
     NEVER,
+    ALWAYS_ARG1,
   };
 
   ImbueAttribute shouldImbueFunction(StringRef FunctionName) const;
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
  • [PATCH] D33392: [XRay]... Dean Michael Berris via Phabricator via cfe-commits

Reply via email to