[XRay][clang] Allow imbuing arg1 logging attribute via -fxray-always-instrument=

Summary:
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

Reviewers: pelikan, rnk

Subscribers: cfe-commits

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

llvm-svn: 303719
This commit is contained in:
Dean Michael Berris 2017-05-24 05:46:36 +00:00
parent 17dfebcc39
commit 170429e290
4 changed files with 19 additions and 0 deletions

View File

@ -37,6 +37,7 @@ public:
NONE, NONE,
ALWAYS, ALWAYS,
NEVER, NEVER,
ALWAYS_ARG1,
}; };
ImbueAttribute shouldImbueFunction(StringRef FunctionName) const; ImbueAttribute shouldImbueFunction(StringRef FunctionName) const;

View File

@ -26,6 +26,8 @@ XRayFunctionFilter::ImbueAttribute
XRayFunctionFilter::shouldImbueFunction(StringRef FunctionName) const { XRayFunctionFilter::shouldImbueFunction(StringRef FunctionName) const {
// First apply the always instrument list, than if it isn't an "always" see // First apply the always instrument list, than if it isn't an "always" see
// whether it's treated as a "never" instrument function. // whether it's treated as a "never" instrument function.
if (AlwaysInstrument->inSection("fun", FunctionName, "arg1"))
return ImbueAttribute::ALWAYS_ARG1;
if (AlwaysInstrument->inSection("fun", FunctionName)) if (AlwaysInstrument->inSection("fun", FunctionName))
return ImbueAttribute::ALWAYS; return ImbueAttribute::ALWAYS;
if (NeverInstrument->inSection("fun", FunctionName)) if (NeverInstrument->inSection("fun", FunctionName))

View File

@ -1508,6 +1508,10 @@ bool CodeGenModule::imbueXRayAttrs(llvm::Function *Fn, SourceLocation Loc,
case ImbueAttr::ALWAYS: case ImbueAttr::ALWAYS:
Fn->addFnAttr("function-instrument", "xray-always"); Fn->addFnAttr("function-instrument", "xray-always");
break; break;
case ImbueAttr::ALWAYS_ARG1:
Fn->addFnAttr("function-instrument", "xray-always");
Fn->addFnAttr("xray-log-args", "1");
break;
case ImbueAttr::NEVER: case ImbueAttr::NEVER:
Fn->addFnAttr("function-instrument", "xray-never"); Fn->addFnAttr("function-instrument", "xray-never");
break; break;

View File

@ -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"