Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[llvm-profgen] Support COFF binary #83972

Merged
merged 7 commits into from
Mar 15, 2024
Merged

[llvm-profgen] Support COFF binary #83972

merged 7 commits into from
Mar 15, 2024

Conversation

HaohaiWen
Copy link
Contributor

Intel Vtune/SEP has supported collecting LBR on Windows and generating
perf-script file which is same format as Linux perf script. This patch
teaches llvm-profgen to disassemble COFF binary so that we can do
Sampling based PGO on Windows.

Intel Vtune/SEP has supported collecting LBR on Windows and generating
perf-script file which is same format as Linux perf script. This patch
teaches llvm-profgen to disassemble COFF binary so that we can do
Sampling based PGO on Windows.
@llvmbot llvmbot added debuginfo PGO Profile Guided Optimizations llvm:binary-utilities labels Mar 5, 2024
@llvmbot
Copy link
Collaborator

llvmbot commented Mar 5, 2024

@llvm/pr-subscribers-llvm-binary-utilities

@llvm/pr-subscribers-pgo

Author: Haohai Wen (HaohaiWen)

Changes

Intel Vtune/SEP has supported collecting LBR on Windows and generating
perf-script file which is same format as Linux perf script. This patch
teaches llvm-profgen to disassemble COFF binary so that we can do
Sampling based PGO on Windows.


Patch is 1.29 MiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/83972.diff

8 Files Affected:

  • (modified) llvm/lib/DebugInfo/Symbolize/Symbolize.cpp (+10-3)
  • (added) llvm/test/tools/llvm-profgen/Inputs/coff-profile.exe ()
  • (added) llvm/test/tools/llvm-profgen/Inputs/coff-profile.pdb ()
  • (added) llvm/test/tools/llvm-profgen/Inputs/coff-profile.perfscript (+1108)
  • (added) llvm/test/tools/llvm-profgen/coff-profile.test (+81)
  • (modified) llvm/tools/llvm-profgen/PerfReader.cpp (+15-2)
  • (modified) llvm/tools/llvm-profgen/ProfiledBinary.cpp (+42-19)
  • (modified) llvm/tools/llvm-profgen/ProfiledBinary.h (+9-3)
diff --git a/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp b/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp
index 5f29226c14b705..32c5e3251df62f 100644
--- a/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp
+++ b/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp
@@ -628,13 +628,20 @@ LLVMSymbolizer::getOrCreateModuleInfo(const std::string &ModuleName) {
   ObjectPair Objects = ObjectsOrErr.get();
 
   std::unique_ptr<DIContext> Context;
-  // If this is a COFF object containing PDB info, use a PDBContext to
-  // symbolize. Otherwise, use DWARF.
+  // If this is a COFF object containing PDB info and not containing DWARF
+  // section, use a PDBContext to symbolize. Otherwise, use DWARF.
   if (auto CoffObject = dyn_cast<COFFObjectFile>(Objects.first)) {
     const codeview::DebugInfo *DebugInfo;
     StringRef PDBFileName;
     auto EC = CoffObject->getDebugPDBInfo(DebugInfo, PDBFileName);
-    if (!EC && DebugInfo != nullptr && !PDBFileName.empty()) {
+    // Use DWARF if there're DWARF sections.
+    bool HasDwarf =
+        llvm::any_of(Objects.first->sections(), [](SectionRef Section) -> bool {
+          if (Expected<StringRef> SectionName = Section.getName())
+            return SectionName.get() == ".debug_info";
+          return false;
+        });
+    if (!EC && !HasDwarf && DebugInfo != nullptr && !PDBFileName.empty()) {
       using namespace pdb;
       std::unique_ptr<IPDBSession> Session;
 
diff --git a/llvm/test/tools/llvm-profgen/Inputs/coff-profile.exe b/llvm/test/tools/llvm-profgen/Inputs/coff-profile.exe
new file mode 100644
index 00000000000000..c47f8872a55187
Binary files /dev/null and b/llvm/test/tools/llvm-profgen/Inputs/coff-profile.exe differ
diff --git a/llvm/test/tools/llvm-profgen/Inputs/coff-profile.pdb b/llvm/test/tools/llvm-profgen/Inputs/coff-profile.pdb
new file mode 100644
index 00000000000000..0108b5fb3447d2
Binary files /dev/null and b/llvm/test/tools/llvm-profgen/Inputs/coff-profile.pdb differ
diff --git a/llvm/test/tools/llvm-profgen/Inputs/coff-profile.perfscript b/llvm/test/tools/llvm-profgen/Inputs/coff-profile.perfscript
new file mode 100644
index 00000000000000..fc2bdc2254b99b
--- /dev/null
+++ b/llvm/test/tools/llvm-profgen/Inputs/coff-profile.perfscript
@@ -0,0 +1,1108 @@
+PERF_RECORD_MMAP2 13892/0: [0x7ff7c37b0000(0x641000) @ 0x1000 00:00 0 0]: r-xp c:\Users\haohaiwe\Desktop\coff-profile.exe
+PERF_RECORD_MMAP 13892/0: [0x7ffdeb210000(0x217000) @ 0x1000]: x c:\Windows\System32\ntdll.dll
+PERF_RECORD_MMAP 13892/0: [0x7ffdea550000(0xc4000) @ 0x1000]: x c:\Windows\System32\kernel32.dll
+PERF_RECORD_MMAP 13892/0: [0x7ffde8a40000(0x3a6000) @ 0x1000]: x c:\Windows\System32\KernelBase.dll
+PERF_RECORD_MMAP 13892/0: [0x7ffde56c0000(0x97000) @ 0x1000]: x c:\Windows\System32\apphelp.dll
+PERF_RECORD_MMAP 13892/0: [0x1dfed190000(0x14000) @ 0x1000]: x c:\Windows\System32\umppc17706.dll
+PERF_RECORD_MMAP 13892/0: [0x1dfed1c0000(0x14000) @ 0x1000]: x c:\Windows\System32\umppc17706.dll
+PERF_RECORD_MMAP 13892/0: [0x1dfed1c0000(0x14000) @ 0x1000]: x c:\Windows\System32\umppc17706.dll
+PERF_RECORD_MMAP 13892/0: [0x7ffde7590000(0x18000) @ 0x1000]: x c:\Windows\System32\kernel.appcore.dll
+PERF_RECORD_MMAP 13892/0: [0x7ffde9ee0000(0xa7000) @ 0x1000]: x c:\Windows\System32\msvcrt.dll
+ 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/-/X/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 
+ 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 
+ 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 
+ 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/-/X/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 
+ 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/-/X/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/-/X/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/-/X/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/-/X/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 
+ 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/-/X/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 
+ 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/-/X/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 
+ 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 
+ 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/-/X/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/-/X/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/-/X/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 
+ 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 
+ 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/-/X/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/-/X/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/-/X/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 
+ 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 
+ 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/-/X/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/-/X/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 
+ 0x7ff7c37b1482/0x7ff7c37b1430/-/X/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/-/X/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 
+ 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37...
[truncated]

@llvmbot
Copy link
Collaborator

llvmbot commented Mar 5, 2024

@llvm/pr-subscribers-debuginfo

Author: Haohai Wen (HaohaiWen)

Changes

Intel Vtune/SEP has supported collecting LBR on Windows and generating
perf-script file which is same format as Linux perf script. This patch
teaches llvm-profgen to disassemble COFF binary so that we can do
Sampling based PGO on Windows.


Patch is 1.29 MiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/83972.diff

8 Files Affected:

  • (modified) llvm/lib/DebugInfo/Symbolize/Symbolize.cpp (+10-3)
  • (added) llvm/test/tools/llvm-profgen/Inputs/coff-profile.exe ()
  • (added) llvm/test/tools/llvm-profgen/Inputs/coff-profile.pdb ()
  • (added) llvm/test/tools/llvm-profgen/Inputs/coff-profile.perfscript (+1108)
  • (added) llvm/test/tools/llvm-profgen/coff-profile.test (+81)
  • (modified) llvm/tools/llvm-profgen/PerfReader.cpp (+15-2)
  • (modified) llvm/tools/llvm-profgen/ProfiledBinary.cpp (+42-19)
  • (modified) llvm/tools/llvm-profgen/ProfiledBinary.h (+9-3)
diff --git a/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp b/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp
index 5f29226c14b705..32c5e3251df62f 100644
--- a/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp
+++ b/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp
@@ -628,13 +628,20 @@ LLVMSymbolizer::getOrCreateModuleInfo(const std::string &ModuleName) {
   ObjectPair Objects = ObjectsOrErr.get();
 
   std::unique_ptr<DIContext> Context;
-  // If this is a COFF object containing PDB info, use a PDBContext to
-  // symbolize. Otherwise, use DWARF.
+  // If this is a COFF object containing PDB info and not containing DWARF
+  // section, use a PDBContext to symbolize. Otherwise, use DWARF.
   if (auto CoffObject = dyn_cast<COFFObjectFile>(Objects.first)) {
     const codeview::DebugInfo *DebugInfo;
     StringRef PDBFileName;
     auto EC = CoffObject->getDebugPDBInfo(DebugInfo, PDBFileName);
-    if (!EC && DebugInfo != nullptr && !PDBFileName.empty()) {
+    // Use DWARF if there're DWARF sections.
+    bool HasDwarf =
+        llvm::any_of(Objects.first->sections(), [](SectionRef Section) -> bool {
+          if (Expected<StringRef> SectionName = Section.getName())
+            return SectionName.get() == ".debug_info";
+          return false;
+        });
+    if (!EC && !HasDwarf && DebugInfo != nullptr && !PDBFileName.empty()) {
       using namespace pdb;
       std::unique_ptr<IPDBSession> Session;
 
diff --git a/llvm/test/tools/llvm-profgen/Inputs/coff-profile.exe b/llvm/test/tools/llvm-profgen/Inputs/coff-profile.exe
new file mode 100644
index 00000000000000..c47f8872a55187
Binary files /dev/null and b/llvm/test/tools/llvm-profgen/Inputs/coff-profile.exe differ
diff --git a/llvm/test/tools/llvm-profgen/Inputs/coff-profile.pdb b/llvm/test/tools/llvm-profgen/Inputs/coff-profile.pdb
new file mode 100644
index 00000000000000..0108b5fb3447d2
Binary files /dev/null and b/llvm/test/tools/llvm-profgen/Inputs/coff-profile.pdb differ
diff --git a/llvm/test/tools/llvm-profgen/Inputs/coff-profile.perfscript b/llvm/test/tools/llvm-profgen/Inputs/coff-profile.perfscript
new file mode 100644
index 00000000000000..fc2bdc2254b99b
--- /dev/null
+++ b/llvm/test/tools/llvm-profgen/Inputs/coff-profile.perfscript
@@ -0,0 +1,1108 @@
+PERF_RECORD_MMAP2 13892/0: [0x7ff7c37b0000(0x641000) @ 0x1000 00:00 0 0]: r-xp c:\Users\haohaiwe\Desktop\coff-profile.exe
+PERF_RECORD_MMAP 13892/0: [0x7ffdeb210000(0x217000) @ 0x1000]: x c:\Windows\System32\ntdll.dll
+PERF_RECORD_MMAP 13892/0: [0x7ffdea550000(0xc4000) @ 0x1000]: x c:\Windows\System32\kernel32.dll
+PERF_RECORD_MMAP 13892/0: [0x7ffde8a40000(0x3a6000) @ 0x1000]: x c:\Windows\System32\KernelBase.dll
+PERF_RECORD_MMAP 13892/0: [0x7ffde56c0000(0x97000) @ 0x1000]: x c:\Windows\System32\apphelp.dll
+PERF_RECORD_MMAP 13892/0: [0x1dfed190000(0x14000) @ 0x1000]: x c:\Windows\System32\umppc17706.dll
+PERF_RECORD_MMAP 13892/0: [0x1dfed1c0000(0x14000) @ 0x1000]: x c:\Windows\System32\umppc17706.dll
+PERF_RECORD_MMAP 13892/0: [0x1dfed1c0000(0x14000) @ 0x1000]: x c:\Windows\System32\umppc17706.dll
+PERF_RECORD_MMAP 13892/0: [0x7ffde7590000(0x18000) @ 0x1000]: x c:\Windows\System32\kernel.appcore.dll
+PERF_RECORD_MMAP 13892/0: [0x7ffde9ee0000(0xa7000) @ 0x1000]: x c:\Windows\System32\msvcrt.dll
+ 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/-/X/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 
+ 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 
+ 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 
+ 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/-/X/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 
+ 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/-/X/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/-/X/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/-/X/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/-/X/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 
+ 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/-/X/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 
+ 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/-/X/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 
+ 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 
+ 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/-/X/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/-/X/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/-/X/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 
+ 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 
+ 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/-/X/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/-/X/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/-/X/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 
+ 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/M/X/A/0 0x7ff7c37b1415/0x7ff7c37b13b0/P/X/A/0 
+ 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/-/X/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/-/X/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 
+ 0x7ff7c37b1482/0x7ff7c37b1430/-/X/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/-/X/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 
+ 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37b1430/P/-/A/0 0x7ff7c37b1482/0x7ff7c37...
[truncated]

@HaohaiWen
Copy link
Contributor Author

Copy link
Collaborator

@tru tru left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this looks great! Can the current version of intel vtune already generate this file, or does it require a specific unreleased version?

I think this needs a release note, and maybe some update to llvm-profgen documentation on how it can be used with vtune for windows binaries.

auto *ELFObj = dyn_cast<ELFObjectFileBase>(&ExeBinary);
IsCOFF = isa<COFFObjectFile>(&ExeBinary);
if (!ELFObj && !IsCOFF)
exitWithError("not a valid Elf/COFF image", Path);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ELF/COFF

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good caught. Thanks.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not sure we want to check in these big files into the repo, even as test data. Usually we generate binaries and PDB's with clang during the tests, but I see that there are other binaries checked in for specifically profgen. I still think it's a bit much with a exe and pdb that's almost 10MB for a single test. Maybe they can be made smaller?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The reason we checked the binaries before is the addresses in the binary have to match the addresses in the perfscript, I'm not sure if it's possible to generate a stable addresses using clang during the test. But agreed that it'd be great to make the binaries smaller.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I deleted the pdb file. It's safe without it.
The Symbolizer code I modified is still well tested by this lit test.

This patch make Symbolizer prefer using DWARF if it exists even if exe indicates there's PDB. We can't get mangled name from PDB so that using PDB to symbolize is meaningless for PGO (see changes 028e247).

clang-cl.exe -O2 -gdwarf -gline-tables-only coff-profile.cpp -fuse-ld=lld -Xclang -fdebug-info-for-profiling -link -debug:dwarf
One thing need to note is that although I had specified -debug:dwarf to lld, PDB file was still generated since clang driver inserted -debug prior to -debug:dwarf to lld linker. Therefore the coff-profile.exe contains both dwarf sections and path to PDB. This is very important to test our Symbolizer code otherwise Symbolizer will find there's no PDB binding to exe and will directly use DWARF.

If we delete the code which prefer using DWARF. The test will failed:
llvm-profgen: error: E:\haohaiwe\compilers\llvm-project\llvm\test\tools\llvm-profgen/Inputs/coff-profile.exe: no such file or directory
The error message reports the exe file path and looks oddly. I've checked the code, the real reason is there's no PDB file.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BTW, adding -gline-tables-only will reduce object size but has no obvious effect for EXE. Looks like min section size for COFF image is 4K.

Copy link
Contributor

@wlei-llvm wlei-llvm left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for supporting the COFF binary.

auto *Obj = dyn_cast<ELFObjectFileBase>(&ExeBinary);
if (!Obj)
exitWithError("not a valid Elf image", Path);
auto *ELFObj = dyn_cast<ELFObjectFileBase>(&ExeBinary);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This feel like there are two Obj files, ELFObj and Obj. Would it make sense here to use isa<ELFObjectFileBase> for the check and cast the Obj file when it's used as ELF file?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Similarly here, I saw the count in the profile is big (like 1.1: 31124), assuming there could be many duplicated LRB entries, we can further make this perfscript smaller.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The reason we checked the binaries before is the addresses in the binary have to match the addresses in the perfscript, I'm not sure if it's possible to generate a stable addresses using clang during the test. But agreed that it'd be great to make the binaries smaller.

@@ -442,8 +464,8 @@ void ProfiledBinary::decodePseudoProbe(const ELFObjectFileBase *Obj) {
void ProfiledBinary::decodePseudoProbe() {
OwningBinary<Binary> OBinary = unwrapOrError(createBinary(Path), Path);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: assert !isCOFF() ...

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done with cast<ELFObjectFileBase>

llvm/tools/llvm-profgen/ProfiledBinary.cpp Outdated Show resolved Hide resolved
@HaohaiWen
Copy link
Contributor Author

I think this looks great! Can the current version of intel vtune already generate this file, or does it require a specific unreleased version?

I think this needs a release note, and maybe some update to llvm-profgen documentation on how it can be used with vtune for windows binaries.

I'm using VTune 2024.0. Here's my cmd (refer to link):

# Open "Intel oneAPI command prompt for Intel 64 for Visual Studio 2022"
sep -start -out app.tb7 -lbr no_filter:usr -perf-script event,ip,brstack -ec BR_INST_RETIRED.NEAR_TAKEN:PRECISE=YES:SA=1000003:pdir:lbr:USR=YES -app coff-profile.exe

sep will generate a app.perf.data.script file. Each line of lbr records starts with "event name which triggered lbr collection" and "address"
e.g. I just deleted the prefix "BR_INST_RETIRED.NEAR_TAKEN:pdir: 7ff70a1b1482" so that llvm-profgen can directly use it.

BR_INST_RETIRED.NEAR_TAKEN:pdir:    7ff70a1b1482 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/-/X/A/0

Currently, -perf-script is not listed in sep -help but we can use it.

@HaohaiWen
Copy link
Contributor Author

I think this looks great! Can the current version of intel vtune already generate this file, or does it require a specific unreleased version?
I think this needs a release note, and maybe some update to llvm-profgen documentation on how it can be used with vtune for windows binaries.

I'm using VTune 2024.0. Here's my cmd (refer to link):

# Open "Intel oneAPI command prompt for Intel 64 for Visual Studio 2022"
sep -start -out app.tb7 -lbr no_filter:usr -perf-script event,ip,brstack -ec BR_INST_RETIRED.NEAR_TAKEN:PRECISE=YES:SA=1000003:pdir:lbr:USR=YES -app coff-profile.exe

sep will generate a app.perf.data.script file. Each line of lbr records starts with "event name which triggered lbr collection" and "address" e.g. I just deleted the prefix "BR_INST_RETIRED.NEAR_TAKEN:pdir: 7ff70a1b1482" so that llvm-profgen can directly use it.

BR_INST_RETIRED.NEAR_TAKEN:pdir:    7ff70a1b1482 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/P/-/A/0 0x7ff70a1b1482/0x7ff70a1b1430/-/X/A/0

Currently, -perf-script is not listed in sep -help but we can use it.

I' like to correct a mistake.
Sep is able to generate perf-script which is completely compatible with llvm-profgen.
Just specify -perf-script brstack to sep cmd.
e.g.

 # Open "Intel oneAPI command prompt for Intel 64 for Visual Studio 2022"
 sep -start -out app.tb7 -lbr no_filter:usr -perf-script brstack -ec BR_INST_RETIRED.NEAR_TAKEN:PRECISE=YES:SA=1000003:pdir:lbr:USR=YES -app coff-profile.exe

Copy link
Collaborator

@tru tru left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM code wise.

I still think this needs some documentation and release notes. I would like to have a release note saying that it's supported in profgen and some examples on how to use in in the profgen manual page (I realize that it's not there for the ELF/perf case, but I think we can set a good precedent and document how to use this.)

tcreech-intel added a commit to tcreech-intel/llvm-project that referenced this pull request Mar 12, 2024
This change:
- Updates the existing Clang User's Manual section on SPGO so that it
  describes how to use llvm-profgen to perform SPGO on Windows. This is
  new functionality implemented in llvm#83972.
- Fixes a minor typo in the existing llvm-profgen invocation example.
- Adds an LLVM release note on this new functionality in llvm-profgen.
@HaohaiWen
Copy link
Contributor Author

Any more comments?
Can we land this patch?

Copy link
Collaborator

@tru tru left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. But wait for another reviewer to approve before merging.

Copy link
Contributor

@wlei-llvm wlei-llvm left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, thanks.

@HaohaiWen
Copy link
Contributor Author

Thanks!

@HaohaiWen HaohaiWen merged commit 8c03f40 into llvm:main Mar 15, 2024
4 checks passed
@HaohaiWen HaohaiWen deleted the coff branch March 15, 2024 01:02
HaohaiWen pushed a commit that referenced this pull request Mar 20, 2024
Following the commit of #83972 which added COFF support for SPGO, this
patch ports the support of the option -lto-sample-profile that was only
available in the ELF variant of LLD to the COFF variant to enable
running the SPGO passes in the LTO/thinLTO pipelines.
chencha3 pushed a commit to chencha3/llvm-project that referenced this pull request Mar 23, 2024
)

Following the commit of llvm#83972 which added COFF support for SPGO, this
patch ports the support of the option -lto-sample-profile that was only
available in the ELF variant of LLD to the COFF variant to enable
running the SPGO passes in the LTO/thinLTO pipelines.
williamweixiao pushed a commit that referenced this pull request Mar 26, 2024
…84864)

This change:
- Updates the existing Clang User's Manual section on SPGO so that it
describes how to use llvm-profgen to perform SPGO on Windows. This is
new functionality implemented in #83972.
- Fixes a minor typo in the existing llvm-profgen invocation example.
- Adds an LLVM release note on this new functionality in llvm-profgen.
qihangkong pushed a commit to rvgpu/llvm that referenced this pull request Apr 18, 2024
Following the commit of llvm/llvm-project#83972 which
added COFF support for SPGO, this patch ports the support of the option
-lto-sample-profile that was only available in the ELF variant of LLD to the
COFF variant to enable SPGO passes of the LTO/thinLTO pipelines.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
debuginfo llvm:binary-utilities PGO Profile Guided Optimizations
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

4 participants