Author: dberris Date: Sun Apr 8 21:02:09 2018 New Revision: 329543 URL: http://llvm.org/viewvc/llvm-project?rev=329543&view=rev Log: [XRay][llvm+clang] Consolidate attribute list files
Summary: This change consolidates the always/never lists that may be provided to clang to externally control which functions should be XRay instrumented by imbuing attributes. The files follow the same format as defined in https://clang.llvm.org/docs/SanitizerSpecialCaseList.html for the sanitizer blacklist. We also deprecate the existing `-fxray-instrument-always=` and `-fxray-instrument-never=` flags, in favour of `-fxray-attr-list=`. This fixes http://llvm.org/PR34721. Reviewers: echristo, vlad.tsyrklevich, eugenis Reviewed By: vlad.tsyrklevich Subscribers: llvm-commits, cfe-commits Differential Revision: https://reviews.llvm.org/D45357 Added: cfe/trunk/test/CodeGen/xray-attr-list.cpp cfe/trunk/test/CodeGen/xray-never-instrument.cpp Modified: cfe/trunk/include/clang/Basic/LangOptions.h cfe/trunk/include/clang/Basic/XRayLists.h cfe/trunk/include/clang/Driver/Options.td cfe/trunk/include/clang/Driver/XRayArgs.h cfe/trunk/lib/AST/ASTContext.cpp cfe/trunk/lib/Basic/XRayLists.cpp cfe/trunk/lib/Driver/XRayArgs.cpp cfe/trunk/lib/Frontend/CompilerInvocation.cpp cfe/trunk/test/CodeGen/xray-always-instrument.cpp cfe/trunk/test/CodeGen/xray-imbue-arg1.cpp Modified: cfe/trunk/include/clang/Basic/LangOptions.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/LangOptions.h?rev=329543&r1=329542&r2=329543&view=diff ============================================================================== --- cfe/trunk/include/clang/Basic/LangOptions.h (original) +++ cfe/trunk/include/clang/Basic/LangOptions.h Sun Apr 8 21:02:09 2018 @@ -148,13 +148,20 @@ public: /// \brief Paths to the XRay "always instrument" files specifying which /// objects (files, functions, variables) should be imbued with the XRay /// "always instrument" attribute. + /// WARNING: This is a deprecated field and will go away in the future. std::vector<std::string> XRayAlwaysInstrumentFiles; /// \brief Paths to the XRay "never instrument" files specifying which /// objects (files, functions, variables) should be imbued with the XRay /// "never instrument" attribute. + /// WARNING: This is a deprecated field and will go away in the future. std::vector<std::string> XRayNeverInstrumentFiles; + /// \brief Paths to the XRay attribute list files, specifying which objects + /// (files, functions, variables) should be imbued with the appropriate XRay + /// attribute(s). + std::vector<std::string> XRayAttrListFiles; + clang::ObjCRuntime ObjCRuntime; std::string ObjCConstantStringClass; Modified: cfe/trunk/include/clang/Basic/XRayLists.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/XRayLists.h?rev=329543&r1=329542&r2=329543&view=diff ============================================================================== --- cfe/trunk/include/clang/Basic/XRayLists.h (original) +++ cfe/trunk/include/clang/Basic/XRayLists.h Sun Apr 8 21:02:09 2018 @@ -26,12 +26,13 @@ namespace clang { class XRayFunctionFilter { std::unique_ptr<llvm::SpecialCaseList> AlwaysInstrument; std::unique_ptr<llvm::SpecialCaseList> NeverInstrument; + std::unique_ptr<llvm::SpecialCaseList> AttrList; SourceManager &SM; public: XRayFunctionFilter(ArrayRef<std::string> AlwaysInstrumentPaths, ArrayRef<std::string> NeverInstrumentPaths, - SourceManager &SM); + ArrayRef<std::string> AttrListPaths, SourceManager &SM); enum class ImbueAttribute { NONE, Modified: cfe/trunk/include/clang/Driver/Options.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=329543&r1=329542&r2=329543&view=diff ============================================================================== --- cfe/trunk/include/clang/Driver/Options.td (original) +++ cfe/trunk/include/clang/Driver/Options.td Sun Apr 8 21:02:09 2018 @@ -1095,11 +1095,15 @@ def fxray_instruction_threshold_ : def fxray_always_instrument : JoinedOrSeparate<["-"], "fxray-always-instrument=">, Group<f_Group>, Flags<[CC1Option]>, - HelpText<"Filename defining the whitelist for imbuing the 'always instrument' XRay attribute.">; + HelpText<"DEPRECATED: Filename defining the whitelist for imbuing the 'always instrument' XRay attribute.">; def fxray_never_instrument : JoinedOrSeparate<["-"], "fxray-never-instrument=">, Group<f_Group>, Flags<[CC1Option]>, - HelpText<"Filename defining the whitelist for imbuing the 'never instrument' XRay attribute.">; + HelpText<"DEPRECATED: Filename defining the whitelist for imbuing the 'never instrument' XRay attribute.">; +def fxray_attr_list : + JoinedOrSeparate<["-"], "fxray-attr-list=">, + Group<f_Group>, Flags<[CC1Option]>, + HelpText<"Filename defining the list of functions/types for imbuing XRay attributes.">; def fxray_always_emit_customevents : Flag<["-"], "fxray-always-emit-customevents">, Group<f_Group>, Flags<[CC1Option]>, Modified: cfe/trunk/include/clang/Driver/XRayArgs.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/XRayArgs.h?rev=329543&r1=329542&r2=329543&view=diff ============================================================================== --- cfe/trunk/include/clang/Driver/XRayArgs.h (original) +++ cfe/trunk/include/clang/Driver/XRayArgs.h Sun Apr 8 21:02:09 2018 @@ -21,6 +21,7 @@ class ToolChain; class XRayArgs { std::vector<std::string> AlwaysInstrumentFiles; std::vector<std::string> NeverInstrumentFiles; + std::vector<std::string> AttrListFiles; std::vector<std::string> ExtraDeps; bool XRayInstrument = false; int InstructionThreshold = 200; Modified: cfe/trunk/lib/AST/ASTContext.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTContext.cpp?rev=329543&r1=329542&r2=329543&view=diff ============================================================================== --- cfe/trunk/lib/AST/ASTContext.cpp (original) +++ cfe/trunk/lib/AST/ASTContext.cpp Sun Apr 8 21:02:09 2018 @@ -788,7 +788,8 @@ ASTContext::ASTContext(LangOptions &LOpt SubstTemplateTemplateParmPacks(this_()), SourceMgr(SM), LangOpts(LOpts), SanitizerBL(new SanitizerBlacklist(LangOpts.SanitizerBlacklistFiles, SM)), XRayFilter(new XRayFunctionFilter(LangOpts.XRayAlwaysInstrumentFiles, - LangOpts.XRayNeverInstrumentFiles, SM)), + LangOpts.XRayNeverInstrumentFiles, + LangOpts.XRayAttrListFiles, SM)), PrintingPolicy(LOpts), Idents(idents), Selectors(sels), BuiltinInfo(builtins), DeclarationNames(*this), Comments(SM), CommentCommandTraits(BumpAlloc, LOpts.CommentOpts), LastSDM(nullptr, 0) { Modified: cfe/trunk/lib/Basic/XRayLists.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/XRayLists.cpp?rev=329543&r1=329542&r2=329543&view=diff ============================================================================== --- cfe/trunk/lib/Basic/XRayLists.cpp (original) +++ cfe/trunk/lib/Basic/XRayLists.cpp Sun Apr 8 21:02:09 2018 @@ -16,24 +16,32 @@ using namespace clang; XRayFunctionFilter::XRayFunctionFilter( ArrayRef<std::string> AlwaysInstrumentPaths, - ArrayRef<std::string> NeverInstrumentPaths, SourceManager &SM) + ArrayRef<std::string> NeverInstrumentPaths, + ArrayRef<std::string> AttrListPaths, SourceManager &SM) : AlwaysInstrument( llvm::SpecialCaseList::createOrDie(AlwaysInstrumentPaths)), NeverInstrument(llvm::SpecialCaseList::createOrDie(NeverInstrumentPaths)), - SM(SM) {} + AttrList(llvm::SpecialCaseList::createOrDie(AttrListPaths)), SM(SM) {} XRayFunctionFilter::ImbueAttribute XRayFunctionFilter::shouldImbueFunction(StringRef FunctionName) const { // First apply the always instrument list, than if it isn't an "always" see // whether it's treated as a "never" instrument function. + // TODO: Remove these as they're deprecated; use the AttrList exclusively. if (AlwaysInstrument->inSection("xray_always_instrument", "fun", FunctionName, - "arg1")) + "arg1") || + AttrList->inSection("always", "fun", FunctionName, "arg1")) return ImbueAttribute::ALWAYS_ARG1; if (AlwaysInstrument->inSection("xray_always_instrument", "fun", - FunctionName)) + FunctionName) || + AttrList->inSection("always", "fun", FunctionName)) return ImbueAttribute::ALWAYS; - if (NeverInstrument->inSection("xray_never_instrument", "fun", FunctionName)) + + if (NeverInstrument->inSection("xray_never_instrument", "fun", + FunctionName) || + AttrList->inSection("never", "fun", FunctionName)) return ImbueAttribute::NEVER; + return ImbueAttribute::NONE; } @@ -41,10 +49,12 @@ XRayFunctionFilter::ImbueAttribute XRayFunctionFilter::shouldImbueFunctionsInFile(StringRef Filename, StringRef Category) const { if (AlwaysInstrument->inSection("xray_always_instrument", "src", Filename, - Category)) + Category) || + AttrList->inSection("always", "src", Filename, Category)) return ImbueAttribute::ALWAYS; if (NeverInstrument->inSection("xray_never_instrument", "src", Filename, - Category)) + Category) || + AttrList->inSection("never", "src", Filename, Category)) return ImbueAttribute::NEVER; return ImbueAttribute::NONE; } Modified: cfe/trunk/lib/Driver/XRayArgs.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/XRayArgs.cpp?rev=329543&r1=329542&r2=329543&view=diff ============================================================================== --- cfe/trunk/lib/Driver/XRayArgs.cpp (original) +++ cfe/trunk/lib/Driver/XRayArgs.cpp Sun Apr 8 21:02:09 2018 @@ -99,6 +99,15 @@ XRayArgs::XRayArgs(const ToolChain &TC, } else D.Diag(clang::diag::err_drv_no_such_file) << Filename; } + + for (const auto &Filename : + Args.getAllArgValues(options::OPT_fxray_attr_list)) { + if (llvm::sys::fs::exists(Filename)) { + AttrListFiles.push_back(Filename); + ExtraDeps.push_back(Filename); + } else + D.Diag(clang::diag::err_drv_no_such_file) << Filename; + } } } @@ -127,6 +136,12 @@ void XRayArgs::addArgs(const ToolChain & CmdArgs.push_back(Args.MakeArgString(NeverInstrumentOpt)); } + for (const auto&AttrFile : AttrListFiles) { + SmallString<64> AttrListFileOpt("-fxray-attr-list="); + AttrListFileOpt += AttrFile; + CmdArgs.push_back(Args.MakeArgString(AttrListFileOpt)); + } + for (const auto &Dep : ExtraDeps) { SmallString<64> ExtraDepOpt("-fdepfile-entry="); ExtraDepOpt += Dep; Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=329543&r1=329542&r2=329543&view=diff ============================================================================== --- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original) +++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Sun Apr 8 21:02:09 2018 @@ -2640,6 +2640,7 @@ static void ParseLangArgs(LangOptions &O Args.getAllArgValues(OPT_fxray_always_instrument); Opts.XRayNeverInstrumentFiles = Args.getAllArgValues(OPT_fxray_never_instrument); + Opts.XRayAttrListFiles = Args.getAllArgValues(OPT_fxray_attr_list); // -fallow-editor-placeholders Opts.AllowEditorPlaceholders = Args.hasArg(OPT_fallow_editor_placeholders); Modified: cfe/trunk/test/CodeGen/xray-always-instrument.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/xray-always-instrument.cpp?rev=329543&r1=329542&r2=329543&view=diff ============================================================================== --- cfe/trunk/test/CodeGen/xray-always-instrument.cpp (original) +++ cfe/trunk/test/CodeGen/xray-always-instrument.cpp Sun Apr 8 21:02:09 2018 @@ -1,6 +1,14 @@ // RUN: echo "fun:*foo*" > %t.always-instrument // RUN: echo "src:*xray-always-instrument.cpp" >> %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 +// RUN: echo "[always]" > %t.xray-attrlist +// RUN: echo "fun:*foo*" >> %t.xray-attrlist +// RUN: echo "src:*xray-always-instrument.cpp" >> %t.xray-attrlist +// RUN: %clang_cc1 -fxray-instrument -x c++ -std=c++11 \ +// RUN: -fxray-always-instrument=%t.always-instrument -emit-llvm -o - %s \ +// RUN: -triple x86_64-unknown-linux-gnu | FileCheck %s +// RUN: %clang_cc1 -fxray-instrument -x c++ -std=c++11 \ +// RUN: -fxray-attr-list=%t.xray-attrlist -emit-llvm -o - %s \ +// RUN: -triple x86_64-unknown-linux-gnu | FileCheck %s void foo() {} Added: cfe/trunk/test/CodeGen/xray-attr-list.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/xray-attr-list.cpp?rev=329543&view=auto ============================================================================== --- cfe/trunk/test/CodeGen/xray-attr-list.cpp (added) +++ cfe/trunk/test/CodeGen/xray-attr-list.cpp Sun Apr 8 21:02:09 2018 @@ -0,0 +1,19 @@ +// RUN: echo "[always]" > %t.xray-attrlist +// RUN: echo "fun:*always*" >> %t.xray-attrlist +// RUN: echo "[never]" >> %t.xray-attrlist +// RUN: echo "fun:*never*" >> %t.xray-attrlist +// RUN: %clang_cc1 -fxray-instrument -x c++ -std=c++11 \ +// RUN: -fxray-attr-list=%t.xray-attrlist -emit-llvm -o - %s \ +// RUN: -triple x86_64-unknown-linux-gnu | FileCheck %s + +void always() {} +void never() {} +[[clang::xray_never_instrument]] void alwaysNever() {} +[[clang::xray_always_instrument]] void neverAlways() {} + +// CHECK: define void @_Z6alwaysv() #[[ALWAYSATTR:[0-9]+]] { +// CHECK: define void @_Z5neverv() #[[NEVERATTR:[0-9]+]] { +// CHECK: define void @_Z11alwaysNeverv() #[[NEVERATTR]] { +// CHECK: define void @_Z11neverAlwaysv() #[[ALWAYSATTR]] { +// CHECK: attributes #[[ALWAYSATTR]] = {{.*}} "function-instrument"="xray-always" {{.*}} +// CHECK: attributes #[[NEVERATTR]] = {{.*}} "function-instrument"="xray-never" {{.*}} Modified: cfe/trunk/test/CodeGen/xray-imbue-arg1.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/xray-imbue-arg1.cpp?rev=329543&r1=329542&r2=329543&view=diff ============================================================================== --- cfe/trunk/test/CodeGen/xray-imbue-arg1.cpp (original) +++ cfe/trunk/test/CodeGen/xray-imbue-arg1.cpp Sun Apr 8 21:02:09 2018 @@ -1,5 +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 +// RUN: echo "[always]" > %t.xray-attrlist +// RUN: echo "fun:*arg1*=arg1" >> %t.xray-attrlist +// RUN: %clang_cc1 -fxray-instrument -x c++ -std=c++11 \ +// RUN: -fxray-always-instrument=%t.always-instrument -emit-llvm -o - %s \ +// RUN: -triple x86_64-unknown-linux-gnu | FileCheck %s +// RUN: %clang_cc1 -fxray-instrument -x c++ -std=c++11 \ +// RUN: -fxray-attr-list=%t.xray-attrlist -emit-llvm -o - %s \ +// RUN: -triple x86_64-unknown-linux-gnu | FileCheck %s void foo() {} Added: cfe/trunk/test/CodeGen/xray-never-instrument.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/xray-never-instrument.cpp?rev=329543&view=auto ============================================================================== --- cfe/trunk/test/CodeGen/xray-never-instrument.cpp (added) +++ cfe/trunk/test/CodeGen/xray-never-instrument.cpp Sun Apr 8 21:02:09 2018 @@ -0,0 +1,24 @@ +// RUN: echo "fun:*foo*" > %t.never-instrument +// RUN: echo "src:*xray-never-instrument.cpp" >> %t.never-instrument +// RUN: echo "[never]" > %t.xray-attrlist +// RUN: echo "fun:*foo*" >> %t.xray-attrlist +// RUN: echo "src:*xray-never-instrument.cpp" >> %t.xray-attrlist +// RUN: %clang_cc1 -fxray-instrument -x c++ -std=c++11 \ +// RUN: -fxray-never-instrument=%t.never-instrument -emit-llvm -o - %s \ +// RUN: -triple x86_64-unknown-linux-gnu | FileCheck %s +// RUN: %clang_cc1 -fxray-instrument -x c++ -std=c++11 \ +// RUN: -fxray-attr-list=%t.xray-attrlist -emit-llvm -o - %s \ +// RUN: -triple x86_64-unknown-linux-gnu | FileCheck %s + +void foo() {} + +[[clang::xray_always_instrument]] void bar() {} + +void baz() {} + +// CHECK: define void @_Z3foov() #[[NEVERATTR:[0-9]+]] { +// CHECK: define void @_Z3barv() #[[ALWAYSATTR:[0-9]+]] { +// CHECK: define void @_Z3bazv() #[[NEVERATTR:[0-9]+]] { +// CHECK: attributes #[[NEVERATTR]] = {{.*}} "function-instrument"="xray-never" {{.*}} +// CHECK: attributes #[[ALWAYSATTR]] = {{.*}} "function-instrument"="xray-always" {{.*}} + _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits