[Lldb-commits] [clang] [lldb] [llvm] [BOLT] Match functions with name similarity (PR #95884)

2024-07-03 Thread Shaw Young via lldb-commits

https://github.com/shawbyoung closed 
https://github.com/llvm/llvm-project/pull/95884
___
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


[Lldb-commits] [clang] [lldb] [llvm] [BOLT] Match functions with name similarity (PR #95884)

2024-07-03 Thread Shaw Young via lldb-commits

https://github.com/shawbyoung updated 
https://github.com/llvm/llvm-project/pull/95884

>From fab60ab1f26be1799f05d1e2b02cc6b89093b670 Mon Sep 17 00:00:00 2001
From: Sayhaan Siddiqui 
Date: Mon, 17 Jun 2024 23:14:07 -0700
Subject: [PATCH 1/9] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20ch?=
 =?UTF-8?q?anges=20to=20main=20this=20commit=20is=20based=20on?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Created using spr 1.3.4

[skip ci]
---
 bolt/include/bolt/Rewrite/DWARFRewriter.h |   4 +-
 bolt/lib/Core/BinaryEmitter.cpp   |   1 +
 bolt/lib/Rewrite/DWARFRewriter.cpp|  61 ++---
 clang/include/clang/Driver/Options.td |   4 +
 clang/lib/Driver/ToolChains/Gnu.cpp   |  29 +++
 cross-project-tests/lit.cfg.py|  14 +-
 cross-project-tests/lit.site.cfg.py.in|   4 +
 lldb/test/API/lit.cfg.py  |   5 +
 lldb/test/API/lit.site.cfg.py.in  |   8 +
 lldb/test/Shell/helper/toolchain.py   |   5 +
 lldb/test/Shell/lit.site.cfg.py.in|   9 +
 llvm/CMakeLists.txt   |   4 +
 llvm/include/llvm/MC/MCFragment.h |  22 ++
 llvm/include/llvm/MC/MCObjectStreamer.h   |   2 +
 llvm/include/llvm/MC/MCStreamer.h |   6 +
 llvm/lib/MC/MCAssembler.cpp   | 118 ++
 llvm/lib/MC/MCExpr.cpp|  10 +-
 llvm/lib/MC/MCFragment.cpp|  12 +
 llvm/lib/MC/MCObjectStreamer.cpp  |   5 +
 llvm/lib/MC/MCStreamer.cpp|   2 +
 .../lib/Target/X86/AsmParser/X86AsmParser.cpp |  24 ++
 llvm/test/MC/X86/directive-avoid_end_align.s  | 208 ++
 22 files changed, 483 insertions(+), 74 deletions(-)
 create mode 100644 llvm/test/MC/X86/directive-avoid_end_align.s

diff --git a/bolt/include/bolt/Rewrite/DWARFRewriter.h 
b/bolt/include/bolt/Rewrite/DWARFRewriter.h
index 8dec32de9008e..3cc9d823c815b 100644
--- a/bolt/include/bolt/Rewrite/DWARFRewriter.h
+++ b/bolt/include/bolt/Rewrite/DWARFRewriter.h
@@ -12,6 +12,7 @@
 #include "bolt/Core/DIEBuilder.h"
 #include "bolt/Core/DebugData.h"
 #include "bolt/Core/DebugNames.h"
+#include "bolt/Core/GDBIndex.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/CodeGen/DIE.h"
 #include "llvm/DWP/DWP.h"
@@ -131,7 +132,8 @@ class DWARFRewriter {
   makeFinalLocListsSection(DWARFVersion Version);
 
   /// Finalize type sections in the main binary.
-  CUOffsetMap finalizeTypeSections(DIEBuilder , DIEStreamer 
);
+  CUOffsetMap finalizeTypeSections(DIEBuilder , DIEStreamer ,
+   GDBIndex );
 
   /// Process and write out CUs that are passsed in.
   void finalizeCompileUnits(DIEBuilder , DIEStreamer ,
diff --git a/bolt/lib/Core/BinaryEmitter.cpp b/bolt/lib/Core/BinaryEmitter.cpp
index 5793963f9b80d..c231fffa0d5ff 100644
--- a/bolt/lib/Core/BinaryEmitter.cpp
+++ b/bolt/lib/Core/BinaryEmitter.cpp
@@ -487,6 +487,7 @@ void BinaryEmitter::emitFunctionBody(BinaryFunction , 
FunctionFragment ,
 // This assumes the second instruction in the macro-op pair will get
 // assigned to its own MCRelaxableFragment. Since all JCC instructions
 // are relaxable, we should be safe.
+Streamer.emitNeverAlignCodeAtEnd(/*Alignment to avoid=*/64, *BC.STI);
   }
 
   if (!EmitCodeOnly) {
diff --git a/bolt/lib/Rewrite/DWARFRewriter.cpp 
b/bolt/lib/Rewrite/DWARFRewriter.cpp
index 8814ebbd10aa5..7b62999dfb2b6 100644
--- a/bolt/lib/Rewrite/DWARFRewriter.cpp
+++ b/bolt/lib/Rewrite/DWARFRewriter.cpp
@@ -185,6 +185,7 @@ namespace bolt {
 class DIEStreamer : public DwarfStreamer {
   DIEBuilder *DIEBldr;
   DWARFRewriter 
+  GDBIndex 
 
 private:
   /// Emit the compilation unit header for \p Unit in the debug_info
@@ -247,7 +248,7 @@ class DIEStreamer : public DwarfStreamer {
 const uint64_t TypeSignature = cast(Unit).getTypeHash();
 DIE *TypeDIE = DIEBldr->getTypeDIE(Unit);
 const DIEBuilder::DWARFUnitInfo  = 
DIEBldr->getUnitInfoByDwarfUnit(Unit);
-Rewriter.addGDBTypeUnitEntry(
+GDBIndexSection.addGDBTypeUnitEntry(
 {UI.UnitOffset, TypeSignature, TypeDIE->getOffset()});
 if (Unit.getVersion() < 5) {
   // Switch the section to .debug_types section.
@@ -279,11 +280,12 @@ class DIEStreamer : public DwarfStreamer {
 
 public:
   DIEStreamer(DIEBuilder *DIEBldr, DWARFRewriter ,
+  GDBIndex ,
   DWARFLinkerBase::OutputFileType OutFileType,
   raw_pwrite_stream ,
   DWARFLinkerBase::MessageHandlerTy Warning)
   : DwarfStreamer(OutFileType, OutFile, Warning), DIEBldr(DIEBldr),
-Rewriter(Rewriter){};
+Rewriter(Rewriter), GDBIndexSection(GDBIndexSection) {};
 
   using DwarfStreamer::emitCompileUnitHeader;
 
@@ -326,12 +328,11 @@ static cl::opt KeepARanges(
 "keep or generate .debug_aranges section if .gdb_index is written"),
 cl::Hidden, cl::cat(BoltCategory));
 

[Lldb-commits] [clang] [lldb] [llvm] [BOLT] Match functions with name similarity (PR #95884)

2024-07-03 Thread Shaw Young via lldb-commits

https://github.com/shawbyoung edited 
https://github.com/llvm/llvm-project/pull/95884
___
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


[Lldb-commits] [clang] [lldb] [llvm] [BOLT][NFC] Move CallGraph from Passes to Core (PR #96922)

2024-06-27 Thread shaw young via lldb-commits

https://github.com/shawbyoung closed 
https://github.com/llvm/llvm-project/pull/96922
___
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


[Lldb-commits] [clang] [lldb] [llvm] [BOLT][NFC] Move CallGraph from Passes to Core (PR #96922)

2024-06-27 Thread shaw young via lldb-commits

https://github.com/shawbyoung edited 
https://github.com/llvm/llvm-project/pull/96922
___
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


[Lldb-commits] [clang] [lldb] [llvm] [BOLT] Hash-based function matching (PR #95821)

2024-06-24 Thread shaw young via lldb-commits

https://github.com/shawbyoung closed 
https://github.com/llvm/llvm-project/pull/95821
___
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


[Lldb-commits] [clang] [lldb] [llvm] [BOLT] Hash-based function matching (PR #95821)

2024-06-24 Thread shaw young via lldb-commits

https://github.com/shawbyoung updated 
https://github.com/llvm/llvm-project/pull/95821

>From 9452bd574023a7aef75b609d36e0ffac68e1e03d Mon Sep 17 00:00:00 2001
From: Sayhaan Siddiqui 
Date: Mon, 17 Jun 2024 11:11:07 -0700
Subject: [PATCH 01/21] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20?=
 =?UTF-8?q?changes=20to=20main=20this=20commit=20is=20based=20on?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Created using spr 1.3.4

[skip ci]
---
 bolt/include/bolt/Rewrite/DWARFRewriter.h |   4 +-
 bolt/lib/Core/BinaryEmitter.cpp   |   1 +
 bolt/lib/Rewrite/DWARFRewriter.cpp|  61 ++---
 clang/include/clang/Driver/Options.td |   4 +
 clang/lib/Driver/ToolChains/Gnu.cpp   |  29 +++
 cross-project-tests/lit.cfg.py|  14 +-
 cross-project-tests/lit.site.cfg.py.in|   4 +
 lldb/test/API/lit.cfg.py  |   5 +
 lldb/test/API/lit.site.cfg.py.in  |   8 +
 lldb/test/Shell/helper/toolchain.py   |   5 +
 lldb/test/Shell/lit.site.cfg.py.in|   9 +
 llvm/CMakeLists.txt   |   4 +
 llvm/include/llvm/MC/MCFragment.h |  22 ++
 llvm/include/llvm/MC/MCObjectStreamer.h   |   2 +
 llvm/include/llvm/MC/MCStreamer.h |   6 +
 llvm/lib/MC/MCAssembler.cpp   | 118 ++
 llvm/lib/MC/MCExpr.cpp|  10 +-
 llvm/lib/MC/MCFragment.cpp|  12 +
 llvm/lib/MC/MCObjectStreamer.cpp  |   5 +
 llvm/lib/MC/MCStreamer.cpp|   2 +
 .../lib/Target/X86/AsmParser/X86AsmParser.cpp |  24 ++
 llvm/test/MC/X86/directive-avoid_end_align.s  | 208 ++
 22 files changed, 483 insertions(+), 74 deletions(-)
 create mode 100644 llvm/test/MC/X86/directive-avoid_end_align.s

diff --git a/bolt/include/bolt/Rewrite/DWARFRewriter.h 
b/bolt/include/bolt/Rewrite/DWARFRewriter.h
index 8dec32de9008e..3cc9d823c815b 100644
--- a/bolt/include/bolt/Rewrite/DWARFRewriter.h
+++ b/bolt/include/bolt/Rewrite/DWARFRewriter.h
@@ -12,6 +12,7 @@
 #include "bolt/Core/DIEBuilder.h"
 #include "bolt/Core/DebugData.h"
 #include "bolt/Core/DebugNames.h"
+#include "bolt/Core/GDBIndex.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/CodeGen/DIE.h"
 #include "llvm/DWP/DWP.h"
@@ -131,7 +132,8 @@ class DWARFRewriter {
   makeFinalLocListsSection(DWARFVersion Version);
 
   /// Finalize type sections in the main binary.
-  CUOffsetMap finalizeTypeSections(DIEBuilder , DIEStreamer 
);
+  CUOffsetMap finalizeTypeSections(DIEBuilder , DIEStreamer ,
+   GDBIndex );
 
   /// Process and write out CUs that are passsed in.
   void finalizeCompileUnits(DIEBuilder , DIEStreamer ,
diff --git a/bolt/lib/Core/BinaryEmitter.cpp b/bolt/lib/Core/BinaryEmitter.cpp
index 5793963f9b80d..c231fffa0d5ff 100644
--- a/bolt/lib/Core/BinaryEmitter.cpp
+++ b/bolt/lib/Core/BinaryEmitter.cpp
@@ -487,6 +487,7 @@ void BinaryEmitter::emitFunctionBody(BinaryFunction , 
FunctionFragment ,
 // This assumes the second instruction in the macro-op pair will get
 // assigned to its own MCRelaxableFragment. Since all JCC instructions
 // are relaxable, we should be safe.
+Streamer.emitNeverAlignCodeAtEnd(/*Alignment to avoid=*/64, *BC.STI);
   }
 
   if (!EmitCodeOnly) {
diff --git a/bolt/lib/Rewrite/DWARFRewriter.cpp 
b/bolt/lib/Rewrite/DWARFRewriter.cpp
index 8814ebbd10aa5..7b62999dfb2b6 100644
--- a/bolt/lib/Rewrite/DWARFRewriter.cpp
+++ b/bolt/lib/Rewrite/DWARFRewriter.cpp
@@ -185,6 +185,7 @@ namespace bolt {
 class DIEStreamer : public DwarfStreamer {
   DIEBuilder *DIEBldr;
   DWARFRewriter 
+  GDBIndex 
 
 private:
   /// Emit the compilation unit header for \p Unit in the debug_info
@@ -247,7 +248,7 @@ class DIEStreamer : public DwarfStreamer {
 const uint64_t TypeSignature = cast(Unit).getTypeHash();
 DIE *TypeDIE = DIEBldr->getTypeDIE(Unit);
 const DIEBuilder::DWARFUnitInfo  = 
DIEBldr->getUnitInfoByDwarfUnit(Unit);
-Rewriter.addGDBTypeUnitEntry(
+GDBIndexSection.addGDBTypeUnitEntry(
 {UI.UnitOffset, TypeSignature, TypeDIE->getOffset()});
 if (Unit.getVersion() < 5) {
   // Switch the section to .debug_types section.
@@ -279,11 +280,12 @@ class DIEStreamer : public DwarfStreamer {
 
 public:
   DIEStreamer(DIEBuilder *DIEBldr, DWARFRewriter ,
+  GDBIndex ,
   DWARFLinkerBase::OutputFileType OutFileType,
   raw_pwrite_stream ,
   DWARFLinkerBase::MessageHandlerTy Warning)
   : DwarfStreamer(OutFileType, OutFile, Warning), DIEBldr(DIEBldr),
-Rewriter(Rewriter){};
+Rewriter(Rewriter), GDBIndexSection(GDBIndexSection) {};
 
   using DwarfStreamer::emitCompileUnitHeader;
 
@@ -326,12 +328,11 @@ static cl::opt KeepARanges(
 "keep or generate .debug_aranges section if .gdb_index is written"),
 cl::Hidden, 

[Lldb-commits] [clang] [lldb] [llvm] [BOLT] Hash-based function matching (PR #95821)

2024-06-24 Thread shaw young via lldb-commits

https://github.com/shawbyoung edited 
https://github.com/llvm/llvm-project/pull/95821
___
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


[Lldb-commits] [clang] [lldb] [llvm] [BOLT][NFC] Add sink block to flow CFG in profile inference (PR #95047)

2024-06-10 Thread shaw young via lldb-commits

https://github.com/shawbyoung reopened 
https://github.com/llvm/llvm-project/pull/95047
___
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


[Lldb-commits] [clang] [lldb] [llvm] [BOLT][NFC] Add sink block to flow CFG in profile inference (PR #95049)

2024-06-10 Thread shaw young via lldb-commits

https://github.com/shawbyoung closed 
https://github.com/llvm/llvm-project/pull/95049
___
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


[Lldb-commits] [clang] [lldb] [llvm] [BOLT][NFC] Add sink block to flow CFG in profile inference (PR #95049)

2024-06-10 Thread shaw young via lldb-commits

https://github.com/shawbyoung created 
https://github.com/llvm/llvm-project/pull/95049

- **Rebase: [Facebook] Add clang driver options to test debug info and BOLT**
- **Rebase: [Facebook] [MC] Introduce NeverAlign fragment type**
- **[BOLT] Fix ValidateMemRefs**
- **[BOLT][NFC] Add sink block to flow CFG in profile inference**


>From c771a162fe79eeaee285a169e7611609f529107d Mon Sep 17 00:00:00 2001
From: Amir Ayupov 
Date: Tue, 1 Jun 2021 11:37:41 -0700
Subject: [PATCH 1/4] Rebase: [Facebook] Add clang driver options to test debug
 info and BOLT

Summary:
This is an essential piece of infrastructure for us to be
continuously testing debug info with BOLT. We can't only make changes
to a test repo because we need to change debuginfo tests to call BOLT,
hence, this diff needs to sit in our opensource repo. But when upstreaming
to LLVM, this should be kept BOLT-only outside of LLVM. When upstreaming,
we need to git diff and check all folders that are being modified by our
commits and discard this one (and leave as an internal diff).

To test BOLT in debuginfo tests, configure it with -DLLVM_TEST_BOLT=ON.
Then run check-lldb and check-debuginfo.

Manual rebase conflict history:
https://phabricator.intern.facebook.com/D29205224
https://phabricator.intern.facebook.com/D29564078
https://phabricator.intern.facebook.com/D33289118
https://phabricator.intern.facebook.com/D34957174
https://phabricator.intern.facebook.com/D35317341

Test Plan:
tested locally
Configured with:
-DLLVM_ENABLE_PROJECTS="clang;lld;lldb;compiler-rt;bolt;debuginfo-tests"
-DLLVM_TEST_BOLT=ON
Ran test suite with:
ninja check-debuginfo
ninja check-lldb

Reviewers: maks, #llvm-bolt

Reviewed By: maks

Subscribers: ayermolo, phabricatorlinter

Differential Revision: https://phabricator.intern.facebook.com/D46256657

Tasks: T92898286
---
 clang/include/clang/Driver/Options.td  |  4 
 clang/lib/Driver/ToolChains/Gnu.cpp| 29 ++
 cross-project-tests/lit.cfg.py | 14 -
 cross-project-tests/lit.site.cfg.py.in |  4 
 lldb/test/API/lit.cfg.py   |  5 +
 lldb/test/API/lit.site.cfg.py.in   |  8 +++
 lldb/test/Shell/helper/toolchain.py|  5 +
 lldb/test/Shell/lit.site.cfg.py.in |  9 
 llvm/CMakeLists.txt|  4 
 9 files changed, 81 insertions(+), 1 deletion(-)

diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index 1637a114fcce1..082ca027261b0 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -5461,6 +5461,10 @@ def pg : Flag<["-"], "pg">, HelpText<"Enable mcount 
instrumentation">,
   MarshallingInfoFlag>;
 def pipe : Flag<["-", "--"], "pipe">,
   HelpText<"Use pipes between commands, when possible">;
+// Facebook T92898286
+def post_link_optimize : Flag<["--"], "post-link-optimize">,
+  HelpText<"Apply post-link optimizations using BOLT">;
+// End Facebook T92898286
 def prebind__all__twolevel__modules : Flag<["-"], 
"prebind_all_twolevel_modules">;
 def prebind : Flag<["-"], "prebind">;
 def preload : Flag<["-"], "preload">;
diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp 
b/clang/lib/Driver/ToolChains/Gnu.cpp
index b141e5f2adfab..f7611af5763ab 100644
--- a/clang/lib/Driver/ToolChains/Gnu.cpp
+++ b/clang/lib/Driver/ToolChains/Gnu.cpp
@@ -672,12 +672,41 @@ void tools::gnutools::Linker::ConstructJob(Compilation 
, const JobAction ,
 }
   }
 
+  // Facebook T92898286
+  if (Args.hasArg(options::OPT_post_link_optimize))
+CmdArgs.push_back("-q");
+  // End Facebook T92898286
+
   Args.AddAllArgs(CmdArgs, options::OPT_T);
 
   const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
   C.addCommand(std::make_unique(JA, *this,
  ResponseFileSupport::AtFileCurCP(),
  Exec, CmdArgs, Inputs, Output));
+  // Facebook T92898286
+  if (!Args.hasArg(options::OPT_post_link_optimize) || !Output.isFilename())
+return;
+
+  const char *MvExec = Args.MakeArgString(ToolChain.GetProgramPath("mv"));
+  ArgStringList MoveCmdArgs;
+  MoveCmdArgs.push_back(Output.getFilename());
+  const char *PreBoltBin =
+  Args.MakeArgString(Twine(Output.getFilename()) + ".pre-bolt");
+  MoveCmdArgs.push_back(PreBoltBin);
+  C.addCommand(std::make_unique(JA, *this, 
ResponseFileSupport::None(),
+ MvExec, MoveCmdArgs, std::nullopt));
+
+  ArgStringList BoltCmdArgs;
+  const char *BoltExec =
+  Args.MakeArgString(ToolChain.GetProgramPath("llvm-bolt"));
+  BoltCmdArgs.push_back(PreBoltBin);
+  BoltCmdArgs.push_back("-reorder-blocks=reverse");
+  BoltCmdArgs.push_back("-update-debug-sections");
+  BoltCmdArgs.push_back("-o");
+  BoltCmdArgs.push_back(Output.getFilename());
+  C.addCommand(std::make_unique(JA, *this, 
ResponseFileSupport::None(),
+ BoltExec, BoltCmdArgs, std::nullopt));
+  // End 

[Lldb-commits] [clang] [lldb] [llvm] [BOLT][NFC] Add sink block to flow CFG in profile inference (PR #95047)

2024-06-10 Thread shaw young via lldb-commits

https://github.com/shawbyoung closed 
https://github.com/llvm/llvm-project/pull/95047
___
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


[Lldb-commits] [clang] [lldb] [llvm] [BOLT][NFC] Add sink block to flow CFG in profile inference (PR #95047)

2024-06-10 Thread shaw young via lldb-commits

https://github.com/shawbyoung edited 
https://github.com/llvm/llvm-project/pull/95047
___
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


[Lldb-commits] [clang] [lldb] [llvm] [BOLT][NFC] Add sink block to flow CFG in profile inference (PR #95047)

2024-06-10 Thread shaw young via lldb-commits

https://github.com/shawbyoung edited 
https://github.com/llvm/llvm-project/pull/95047
___
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


[Lldb-commits] [clang] [lldb] [llvm] shawbyoung/BOLT/constructing sink block in stale profile matching (PR #95047)

2024-06-10 Thread shaw young via lldb-commits

https://github.com/shawbyoung created 
https://github.com/llvm/llvm-project/pull/95047

- **Rebase: [Facebook] Add clang driver options to test debug info and BOLT**
- **Rebase: [Facebook] [MC] Introduce NeverAlign fragment type**
- **[BOLT] Fix ValidateMemRefs**
- **[BOLT][NFC] Add sink block to flow CFG in profile inference**


>From c771a162fe79eeaee285a169e7611609f529107d Mon Sep 17 00:00:00 2001
From: Amir Ayupov 
Date: Tue, 1 Jun 2021 11:37:41 -0700
Subject: [PATCH 1/4] Rebase: [Facebook] Add clang driver options to test debug
 info and BOLT

Summary:
This is an essential piece of infrastructure for us to be
continuously testing debug info with BOLT. We can't only make changes
to a test repo because we need to change debuginfo tests to call BOLT,
hence, this diff needs to sit in our opensource repo. But when upstreaming
to LLVM, this should be kept BOLT-only outside of LLVM. When upstreaming,
we need to git diff and check all folders that are being modified by our
commits and discard this one (and leave as an internal diff).

To test BOLT in debuginfo tests, configure it with -DLLVM_TEST_BOLT=ON.
Then run check-lldb and check-debuginfo.

Manual rebase conflict history:
https://phabricator.intern.facebook.com/D29205224
https://phabricator.intern.facebook.com/D29564078
https://phabricator.intern.facebook.com/D33289118
https://phabricator.intern.facebook.com/D34957174
https://phabricator.intern.facebook.com/D35317341

Test Plan:
tested locally
Configured with:
-DLLVM_ENABLE_PROJECTS="clang;lld;lldb;compiler-rt;bolt;debuginfo-tests"
-DLLVM_TEST_BOLT=ON
Ran test suite with:
ninja check-debuginfo
ninja check-lldb

Reviewers: maks, #llvm-bolt

Reviewed By: maks

Subscribers: ayermolo, phabricatorlinter

Differential Revision: https://phabricator.intern.facebook.com/D46256657

Tasks: T92898286
---
 clang/include/clang/Driver/Options.td  |  4 
 clang/lib/Driver/ToolChains/Gnu.cpp| 29 ++
 cross-project-tests/lit.cfg.py | 14 -
 cross-project-tests/lit.site.cfg.py.in |  4 
 lldb/test/API/lit.cfg.py   |  5 +
 lldb/test/API/lit.site.cfg.py.in   |  8 +++
 lldb/test/Shell/helper/toolchain.py|  5 +
 lldb/test/Shell/lit.site.cfg.py.in |  9 
 llvm/CMakeLists.txt|  4 
 9 files changed, 81 insertions(+), 1 deletion(-)

diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index 1637a114fcce1..082ca027261b0 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -5461,6 +5461,10 @@ def pg : Flag<["-"], "pg">, HelpText<"Enable mcount 
instrumentation">,
   MarshallingInfoFlag>;
 def pipe : Flag<["-", "--"], "pipe">,
   HelpText<"Use pipes between commands, when possible">;
+// Facebook T92898286
+def post_link_optimize : Flag<["--"], "post-link-optimize">,
+  HelpText<"Apply post-link optimizations using BOLT">;
+// End Facebook T92898286
 def prebind__all__twolevel__modules : Flag<["-"], 
"prebind_all_twolevel_modules">;
 def prebind : Flag<["-"], "prebind">;
 def preload : Flag<["-"], "preload">;
diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp 
b/clang/lib/Driver/ToolChains/Gnu.cpp
index b141e5f2adfab..f7611af5763ab 100644
--- a/clang/lib/Driver/ToolChains/Gnu.cpp
+++ b/clang/lib/Driver/ToolChains/Gnu.cpp
@@ -672,12 +672,41 @@ void tools::gnutools::Linker::ConstructJob(Compilation 
, const JobAction ,
 }
   }
 
+  // Facebook T92898286
+  if (Args.hasArg(options::OPT_post_link_optimize))
+CmdArgs.push_back("-q");
+  // End Facebook T92898286
+
   Args.AddAllArgs(CmdArgs, options::OPT_T);
 
   const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
   C.addCommand(std::make_unique(JA, *this,
  ResponseFileSupport::AtFileCurCP(),
  Exec, CmdArgs, Inputs, Output));
+  // Facebook T92898286
+  if (!Args.hasArg(options::OPT_post_link_optimize) || !Output.isFilename())
+return;
+
+  const char *MvExec = Args.MakeArgString(ToolChain.GetProgramPath("mv"));
+  ArgStringList MoveCmdArgs;
+  MoveCmdArgs.push_back(Output.getFilename());
+  const char *PreBoltBin =
+  Args.MakeArgString(Twine(Output.getFilename()) + ".pre-bolt");
+  MoveCmdArgs.push_back(PreBoltBin);
+  C.addCommand(std::make_unique(JA, *this, 
ResponseFileSupport::None(),
+ MvExec, MoveCmdArgs, std::nullopt));
+
+  ArgStringList BoltCmdArgs;
+  const char *BoltExec =
+  Args.MakeArgString(ToolChain.GetProgramPath("llvm-bolt"));
+  BoltCmdArgs.push_back(PreBoltBin);
+  BoltCmdArgs.push_back("-reorder-blocks=reverse");
+  BoltCmdArgs.push_back("-update-debug-sections");
+  BoltCmdArgs.push_back("-o");
+  BoltCmdArgs.push_back(Output.getFilename());
+  C.addCommand(std::make_unique(JA, *this, 
ResponseFileSupport::None(),
+ BoltExec, BoltCmdArgs, std::nullopt));
+  // End