[clang] 0eb7d86 - Revert "[InstrProf] Add new format for -fprofile-list="

Nico Weber via cfe-commits cfe-commits at lists.llvm.org
Thu Aug 4 10:05:19 PDT 2022


Author: Nico Weber
Date: 2022-08-04T13:04:59-04:00
New Revision: 0eb7d86f5873ce897894339a3cc5bc69ca507bee

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

LOG: Revert "[InstrProf] Add new format for -fprofile-list="

This reverts commit b692312ca432d9a379f67a8d83177a6f1722baaa.
Breaks tests on Windows, see https://reviews.llvm.org/D130808#3699952

Added: 
    

Modified: 
    clang/docs/UsersManual.rst
    clang/include/clang/Basic/ProfileList.h
    clang/lib/Basic/ProfileList.cpp
    clang/lib/CodeGen/CodeGenFunction.cpp
    clang/lib/CodeGen/CodeGenModule.cpp
    clang/lib/CodeGen/CodeGenModule.h
    clang/test/CodeGen/profile-function-groups.c

Removed: 
    clang/test/CodeGen/profile-filter-new.c


################################################################################
diff  --git a/clang/docs/UsersManual.rst b/clang/docs/UsersManual.rst
index f9ccca65f3889..15df488e802de 100644
--- a/clang/docs/UsersManual.rst
+++ b/clang/docs/UsersManual.rst
@@ -2500,66 +2500,43 @@ This can be done using the ``-fprofile-list`` option.
 
   .. code-block:: console
 
+    $ echo "fun:test" > fun.list
     $ clang++ -O2 -fprofile-instr-generate -fprofile-list=fun.list code.cc -o code
 
-  The option can be specified multiple times to pass multiple files.
+The option can be specified multiple times to pass multiple files.
 
-  .. code-block:: console
-
-    $ clang++ -O2 -fprofile-instr-generate -fcoverage-mapping -fprofile-list=fun.list -fprofile-list=code.list code.cc -o code
-
-Supported sections are ``[clang]``, ``[llvm]``, and ``[csllvm]`` representing
-clang PGO, IRPGO, and CSIRPGO, respectively. Supported prefixes are ``function``
-and ``source``. Supported categories are ``allow``, ``skip``, and ``forbid``.
-``skip`` adds the ``skipprofile`` attribute while ``forbid`` adds the
-``noprofile`` attribute to the appropriate function. Use
-``default:<allow|skip|forbid>`` to specify the default category.
-
-  .. code-block:: console
-
-    $ cat fun.list
-    # The following cases are for clang instrumentation.
-    [clang]
-
-    # We might not want to profile functions that are inlined in many places.
-    function:inlinedLots=skip
-
-    # We want to forbid profiling where it might be dangerous.
-    source:lib/unsafe/*.cc=forbid
+.. code-block:: console
 
-    # Otherwise we allow profiling.
-    default:allow
+    $ echo "!fun:*test*" > fun.list
+    $ echo "src:code.cc" > src.list
+    % clang++ -O2 -fprofile-instr-generate -fcoverage-mapping -fprofile-list=fun.list -fprofile-list=code.list code.cc -o code
 
-Older Prefixes
-""""""""""""""
-  An older format is also supported, but it is only able to add the
-  ``noprofile`` attribute.
-  To filter individual functions or entire source files use ``fun:<name>`` or
-  ``src:<file>`` respectively. To exclude a function or a source file, use
-  ``!fun:<name>`` or ``!src:<file>`` respectively. The format also supports
-  wildcard expansion. The compiler generated functions are assumed to be located
-  in the main source file.  It is also possible to restrict the filter to a
-  particular instrumentation type by using a named section.
+To filter individual functions or entire source files using ``fun:<name>`` or
+``src:<file>`` respectively. To exclude a function or a source file, use
+``!fun:<name>`` or ``!src:<file>`` respectively. The format also supports
+wildcard expansion. The compiler generated functions are assumed to be located
+in the main source file.  It is also possible to restrict the filter to a
+particular instrumentation type by using a named section.
 
-  .. code-block:: none
+.. code-block:: none
 
-    # all functions whose name starts with foo will be instrumented.
-    fun:foo*
+  # all functions whose name starts with foo will be instrumented.
+  fun:foo*
 
-    # except for foo1 which will be excluded from instrumentation.
-    !fun:foo1
+  # except for foo1 which will be excluded from instrumentation.
+  !fun:foo1
 
-    # every function in path/to/foo.cc will be instrumented.
-    src:path/to/foo.cc
+  # every function in path/to/foo.cc will be instrumented.
+  src:path/to/foo.cc
 
-    # bar will be instrumented only when using backend instrumentation.
-    # Recognized section names are clang, llvm and csllvm.
-    [llvm]
-    fun:bar
+  # bar will be instrumented only when using backend instrumentation.
+  # Recognized section names are clang, llvm and csllvm.
+  [llvm]
+  fun:bar
 
-  When the file contains only excludes, all files and functions except for the
-  excluded ones will be instrumented. Otherwise, only the files and functions
-  specified will be instrumented.
+When the file contains only excludes, all files and functions except for the
+excluded ones will be instrumented. Otherwise, only the files and functions
+specified will be instrumented.
 
 Instrument function groups
 ^^^^^^^^^^^^^^^^^^^^^^^^^^

diff  --git a/clang/include/clang/Basic/ProfileList.h b/clang/include/clang/Basic/ProfileList.h
index f7768004b23b0..aa472f126818d 100644
--- a/clang/include/clang/Basic/ProfileList.h
+++ b/clang/include/clang/Basic/ProfileList.h
@@ -26,38 +26,25 @@ namespace clang {
 class ProfileSpecialCaseList;
 
 class ProfileList {
-public:
-  /// Represents if an how something should be excluded from profiling.
-  enum ExclusionType {
-    /// Profiling is allowed.
-    Allow,
-    /// Profiling is skipped using the \p skipprofile attribute.
-    Skip,
-    /// Profiling is forbidden using the \p noprofile attribute.
-    Forbid,
-  };
-
-private:
   std::unique_ptr<ProfileSpecialCaseList> SCL;
   const bool Empty;
+  const bool Default;
   SourceManager &SM;
-  llvm::Optional<ExclusionType> inSection(StringRef Section, StringRef Prefix,
-                                          StringRef Query) const;
 
 public:
   ProfileList(ArrayRef<std::string> Paths, SourceManager &SM);
   ~ProfileList();
 
   bool isEmpty() const { return Empty; }
-  ExclusionType getDefault(CodeGenOptions::ProfileInstrKind Kind) const;
+  bool getDefault() const { return Default; }
 
-  llvm::Optional<ExclusionType>
+  llvm::Optional<bool>
   isFunctionExcluded(StringRef FunctionName,
                      CodeGenOptions::ProfileInstrKind Kind) const;
-  llvm::Optional<ExclusionType>
+  llvm::Optional<bool>
   isLocationExcluded(SourceLocation Loc,
                      CodeGenOptions::ProfileInstrKind Kind) const;
-  llvm::Optional<ExclusionType>
+  llvm::Optional<bool>
   isFileExcluded(StringRef FileName,
                  CodeGenOptions::ProfileInstrKind Kind) const;
 };

diff  --git a/clang/lib/Basic/ProfileList.cpp b/clang/lib/Basic/ProfileList.cpp
index 4c17a540aad66..9c88559d1c333 100644
--- a/clang/lib/Basic/ProfileList.cpp
+++ b/clang/lib/Basic/ProfileList.cpp
@@ -66,7 +66,8 @@ ProfileSpecialCaseList::createOrDie(const std::vector<std::string> &Paths,
 ProfileList::ProfileList(ArrayRef<std::string> Paths, SourceManager &SM)
     : SCL(ProfileSpecialCaseList::createOrDie(
           Paths, SM.getFileManager().getVirtualFileSystem())),
-      Empty(SCL->isEmpty()), SM(SM) {}
+      Empty(SCL->isEmpty()),
+      Default(SCL->hasPrefix("fun") || SCL->hasPrefix("src")), SM(SM) {}
 
 ProfileList::~ProfileList() = default;
 
@@ -84,66 +85,30 @@ static StringRef getSectionName(CodeGenOptions::ProfileInstrKind Kind) {
   llvm_unreachable("Unhandled CodeGenOptions::ProfileInstrKind enum");
 }
 
-ProfileList::ExclusionType
-ProfileList::getDefault(CodeGenOptions::ProfileInstrKind Kind) const {
-  StringRef Section = getSectionName(Kind);
-  // Check for "default:<type>"
-  if (SCL->inSection(Section, "default", "allow"))
-    return Allow;
-  if (SCL->inSection(Section, "default", "skip"))
-    return Skip;
-  if (SCL->inSection(Section, "default", "forbid"))
-    return Forbid;
-  // If any cases use "fun" or "src", set the default to FORBID.
-  if (SCL->hasPrefix("fun") || SCL->hasPrefix("src"))
-    return Forbid;
-  return Allow;
-}
-
-llvm::Optional<ProfileList::ExclusionType>
-ProfileList::inSection(StringRef Section, StringRef Prefix,
-                       StringRef Query) const {
-  if (SCL->inSection(Section, Prefix, Query, "allow"))
-    return Allow;
-  if (SCL->inSection(Section, Prefix, Query, "skip"))
-    return Skip;
-  if (SCL->inSection(Section, Prefix, Query, "forbid"))
-    return Forbid;
-  if (SCL->inSection(Section, Prefix, Query))
-    return Allow;
-  return None;
-}
-
-llvm::Optional<ProfileList::ExclusionType>
+llvm::Optional<bool>
 ProfileList::isFunctionExcluded(StringRef FunctionName,
                                 CodeGenOptions::ProfileInstrKind Kind) const {
   StringRef Section = getSectionName(Kind);
-  // Check for "function:<regex>=<case>"
-  if (auto V = inSection(Section, "function", FunctionName))
-    return V;
   if (SCL->inSection(Section, "!fun", FunctionName))
-    return Forbid;
+    return true;
   if (SCL->inSection(Section, "fun", FunctionName))
-    return Allow;
+    return false;
   return None;
 }
 
-llvm::Optional<ProfileList::ExclusionType>
+llvm::Optional<bool>
 ProfileList::isLocationExcluded(SourceLocation Loc,
                                 CodeGenOptions::ProfileInstrKind Kind) const {
   return isFileExcluded(SM.getFilename(SM.getFileLoc(Loc)), Kind);
 }
 
-llvm::Optional<ProfileList::ExclusionType>
+llvm::Optional<bool>
 ProfileList::isFileExcluded(StringRef FileName,
                             CodeGenOptions::ProfileInstrKind Kind) const {
   StringRef Section = getSectionName(Kind);
-  // Check for "source:<regex>=<case>"
-  if (auto V = inSection(Section, "source", FileName))
-    return V;
   if (SCL->inSection(Section, "!src", FileName))
-    return Forbid;
+    return true;
   if (SCL->inSection(Section, "src", FileName))
-    return Allow;
+    return false;
   return None;
 }

diff  --git a/clang/lib/CodeGen/CodeGenFunction.cpp b/clang/lib/CodeGen/CodeGenFunction.cpp
index 7997a07ebe1d7..d2f251521ff5a 100644
--- a/clang/lib/CodeGen/CodeGenFunction.cpp
+++ b/clang/lib/CodeGen/CodeGenFunction.cpp
@@ -851,18 +851,9 @@ void CodeGenFunction::StartFunction(GlobalDecl GD, QualType RetTy,
     }
   }
 
-  if (CGM.getCodeGenOpts().getProfileInstr() != CodeGenOptions::ProfileNone) {
-    switch (CGM.isFunctionBlockedFromProfileInstr(Fn, Loc)) {
-    case ProfileList::Skip:
-      Fn->addFnAttr(llvm::Attribute::SkipProfile);
-      break;
-    case ProfileList::Forbid:
+  if (CGM.getCodeGenOpts().getProfileInstr() != CodeGenOptions::ProfileNone)
+    if (CGM.isFunctionBlockedFromProfileInstr(Fn, Loc))
       Fn->addFnAttr(llvm::Attribute::NoProfile);
-      break;
-    case ProfileList::Allow:
-      break;
-    }
-  }
 
   unsigned Count, Offset;
   if (const auto *Attr =

diff  --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp
index 8771f9e7f56d2..537cb78611b4b 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -2895,44 +2895,46 @@ bool CodeGenModule::imbueXRayAttrs(llvm::Function *Fn, SourceLocation Loc,
   return true;
 }
 
-ProfileList::ExclusionType
-CodeGenModule::isFunctionBlockedByProfileList(llvm::Function *Fn,
-                                              SourceLocation Loc) const {
+bool CodeGenModule::isFunctionBlockedByProfileList(llvm::Function *Fn,
+                                                   SourceLocation Loc) const {
   const auto &ProfileList = getContext().getProfileList();
   // If the profile list is empty, then instrument everything.
   if (ProfileList.isEmpty())
-    return ProfileList::Allow;
+    return false;
   CodeGenOptions::ProfileInstrKind Kind = getCodeGenOpts().getProfileInstr();
   // First, check the function name.
-  if (auto V = ProfileList.isFunctionExcluded(Fn->getName(), Kind))
+  Optional<bool> V = ProfileList.isFunctionExcluded(Fn->getName(), Kind);
+  if (V)
     return *V;
   // Next, check the source location.
-  if (Loc.isValid())
-    if (auto V = ProfileList.isLocationExcluded(Loc, Kind))
+  if (Loc.isValid()) {
+    Optional<bool> V = ProfileList.isLocationExcluded(Loc, Kind);
+    if (V)
       return *V;
+  }
   // If location is unknown, this may be a compiler-generated function. Assume
   // it's located in the main file.
   auto &SM = Context.getSourceManager();
-  if (const auto *MainFile = SM.getFileEntryForID(SM.getMainFileID()))
-    if (auto V = ProfileList.isFileExcluded(MainFile->getName(), Kind))
+  if (const auto *MainFile = SM.getFileEntryForID(SM.getMainFileID())) {
+    Optional<bool> V = ProfileList.isFileExcluded(MainFile->getName(), Kind);
+    if (V)
       return *V;
-  return ProfileList.getDefault(Kind);
+  }
+  return ProfileList.getDefault();
 }
 
-ProfileList::ExclusionType
-CodeGenModule::isFunctionBlockedFromProfileInstr(llvm::Function *Fn,
-                                                 SourceLocation Loc) const {
-  auto V = isFunctionBlockedByProfileList(Fn, Loc);
-  if (V != ProfileList::Allow)
-    return V;
+bool CodeGenModule::isFunctionBlockedFromProfileInstr(
+    llvm::Function *Fn, SourceLocation Loc) const {
+  if (isFunctionBlockedByProfileList(Fn, Loc))
+    return true;
 
   auto NumGroups = getCodeGenOpts().ProfileTotalFunctionGroups;
   if (NumGroups > 1) {
     auto Group = llvm::crc32(arrayRefFromStringRef(Fn->getName())) % NumGroups;
     if (Group != getCodeGenOpts().ProfileSelectedFunctionGroup)
-      return ProfileList::Skip;
+      return true;
   }
-  return ProfileList::Allow;
+  return false;
 }
 
 bool CodeGenModule::MustBeEmitted(const ValueDecl *Global) {

diff  --git a/clang/lib/CodeGen/CodeGenModule.h b/clang/lib/CodeGen/CodeGenModule.h
index 14c791f4bce57..5fbcc5ad1f5fe 100644
--- a/clang/lib/CodeGen/CodeGenModule.h
+++ b/clang/lib/CodeGen/CodeGenModule.h
@@ -1351,14 +1351,13 @@ class CodeGenModule : public CodeGenTypeCache {
 
   /// \returns true if \p Fn at \p Loc should be excluded from profile
   /// instrumentation by the SCL passed by \p -fprofile-list.
-  ProfileList::ExclusionType
-  isFunctionBlockedByProfileList(llvm::Function *Fn, SourceLocation Loc) const;
+  bool isFunctionBlockedByProfileList(llvm::Function *Fn,
+                                      SourceLocation Loc) const;
 
   /// \returns true if \p Fn at \p Loc should be excluded from profile
   /// instrumentation.
-  ProfileList::ExclusionType
-  isFunctionBlockedFromProfileInstr(llvm::Function *Fn,
-                                    SourceLocation Loc) const;
+  bool isFunctionBlockedFromProfileInstr(llvm::Function *Fn,
+                                         SourceLocation Loc) const;
 
   SanitizerMetadata *getSanitizerMetadata() {
     return SanitizerMD.get();

diff  --git a/clang/test/CodeGen/profile-filter-new.c b/clang/test/CodeGen/profile-filter-new.c
deleted file mode 100644
index c6fdc31abbc21..0000000000000
--- a/clang/test/CodeGen/profile-filter-new.c
+++ /dev/null
@@ -1,27 +0,0 @@
-// RUN: %clang_cc1 -fprofile-instrument=llvm -emit-llvm %s -o - | FileCheck %s --implicit-check-not="; {{.* (noprofile|skipprofile)}}"
-
-// RUN: echo -e "[llvm]\nfunction:foo=skip" > %t0.list
-// RUN: %clang_cc1 -fprofile-instrument=llvm -fprofile-list=%t0.list -emit-llvm %s -o - | FileCheck %s --implicit-check-not="; {{.* (noprofile|skipprofile)}}" --check-prefixes=CHECK,SKIP-FOO
-
-// RUN: echo -e "[csllvm]\nfunction:bar=forbid" > %t1.list
-// RUN: %clang_cc1 -fprofile-instrument=csllvm -fprofile-list=%t1.list -emit-llvm %s -o - | FileCheck %s --implicit-check-not="; {{.* (noprofile|skipprofile)}}" --check-prefixes=CHECK,FORBID-BAR
-// RUN: %clang_cc1 -fprofile-instrument=llvm -fprofile-list=%t1.list -emit-llvm %s -o - | FileCheck %s --implicit-check-not="; {{.* (noprofile|skipprofile)}}"
-
-// RUN: echo -e "[llvm]\ndefault:forbid\nfunction:foo=allow" > %t2.list
-// RUN: %clang_cc1 -fprofile-instrument=llvm -fprofile-list=%t2.list -emit-llvm %s -o - | FileCheck %s --implicit-check-not="; {{.* (noprofile|skipprofile)}}" --check-prefixes=CHECK,FORBID
-
-// RUN: echo -e "[llvm]\nsource:%s=forbid\nfunction:foo=allow" | sed -e 's/\\/\\\\/g' > %t2.list
-// RUN: %clang_cc1 -fprofile-instrument=llvm -fprofile-list=%t2.list -emit-llvm %s -o - | FileCheck %s --implicit-check-not="; {{.* (noprofile|skipprofile)}}" --check-prefixes=CHECK,FORBID
-
-// SKIP-FOO: skipprofile
-// CHECK-LABEL: define {{.*}} @foo
-int foo(int a) { return 4 * a + 1; }
-
-// FORBID-BAR: noprofile
-// FORBID: noprofile
-// CHECK-LABEL: define {{.*}} @bar
-int bar(int a) { return 4 * a + 2; }
-
-// FORBID: noprofile
-// CHECK-LABEL: define {{.*}} @goo
-int goo(int a) { return 4 * a + 3; }

diff  --git a/clang/test/CodeGen/profile-function-groups.c b/clang/test/CodeGen/profile-function-groups.c
index 052e867645944..232abd767a8fd 100644
--- a/clang/test/CodeGen/profile-function-groups.c
+++ b/clang/test/CodeGen/profile-function-groups.c
@@ -4,21 +4,21 @@
 
 // Group 0
 
-// SELECT1: skipprofile
-// SELECT2: skipprofile
+// SELECT1: noprofile
+// SELECT2: noprofile
 // CHECK: define {{.*}} @hoo()
 void hoo() {}
 
 // Group 1
-// SELECT0: skipprofile
+// SELECT0: noprofile
 
-// SELECT2: skipprofile
+// SELECT2: noprofile
 // CHECK: define {{.*}} @goo()
 void goo() {}
 
 // Group 2
-// SELECT0: skipprofile
-// SELECT1: skipprofile
+// SELECT0: noprofile
+// SELECT1: noprofile
 
 // CHECK: define {{.*}} @boo()
 void boo() {}


        


More information about the cfe-commits mailing list