[Lldb-commits] [lldb] 547917a - Revert "[lldb] Extend frame recognizers to hide frames from backtraces (#104523)"

Dmitri Gribenko via lldb-commits lldb-commits at lists.llvm.org
Thu Aug 22 04:28:29 PDT 2024


Author: Dmitri Gribenko
Date: 2024-08-22T13:24:57+02:00
New Revision: 547917aebd1e79a8929b53f0ddf3b5185ee4df74

URL: https://github.com/llvm/llvm-project/commit/547917aebd1e79a8929b53f0ddf3b5185ee4df74
DIFF: https://github.com/llvm/llvm-project/commit/547917aebd1e79a8929b53f0ddf3b5185ee4df74.diff

LOG: Revert "[lldb] Extend frame recognizers to hide frames from backtraces (#104523)"

This reverts commit f01f80ce6ca7640bb0e267b84b1ed0e89b57e2d9.

This commit introduces an msan violation. See the discussion on https://github.com/llvm/llvm-project/pull/104523.

Added: 
    

Modified: 
    lldb/bindings/python/python-wrapper.swig
    lldb/include/lldb/API/SBFrame.h
    lldb/include/lldb/Interpreter/ScriptInterpreter.h
    lldb/include/lldb/Target/StackFrame.h
    lldb/include/lldb/Target/StackFrameList.h
    lldb/include/lldb/Target/StackFrameRecognizer.h
    lldb/include/lldb/Target/Thread.h
    lldb/source/API/SBFrame.cpp
    lldb/source/API/SBThread.cpp
    lldb/source/Commands/CommandCompletions.cpp
    lldb/source/Commands/CommandObjectFrame.cpp
    lldb/source/Commands/CommandObjectMemory.cpp
    lldb/source/Commands/CommandObjectThread.cpp
    lldb/source/Commands/Options.td
    lldb/source/Core/Debugger.cpp
    lldb/source/Interpreter/CommandInterpreter.cpp
    lldb/source/Plugins/LanguageRuntime/CPlusPlus/CPPLanguageRuntime.cpp
    lldb/source/Plugins/ScriptInterpreter/Python/SWIGPythonBridge.h
    lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp
    lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPythonImpl.h
    lldb/source/Target/Process.cpp
    lldb/source/Target/StackFrame.cpp
    lldb/source/Target/StackFrameList.cpp
    lldb/source/Target/StackFrameRecognizer.cpp
    lldb/source/Target/Thread.cpp
    lldb/source/Target/ThreadPlanStepOut.cpp
    lldb/test/API/commands/frame/recognizer/TestFrameRecognizer.py
    lldb/test/API/commands/frame/recognizer/main.m
    lldb/test/API/commands/frame/recognizer/recognizer.py

Removed: 
    lldb/test/API/lang/cpp/std-function-recognizer/Makefile
    lldb/test/API/lang/cpp/std-function-recognizer/TestStdFunctionRecognizer.py
    lldb/test/API/lang/cpp/std-function-recognizer/main.cpp


################################################################################
diff  --git a/lldb/bindings/python/python-wrapper.swig b/lldb/bindings/python/python-wrapper.swig
index 2ce42e3e017d5b..8f050643fa68b3 100644
--- a/lldb/bindings/python/python-wrapper.swig
+++ b/lldb/bindings/python/python-wrapper.swig
@@ -813,7 +813,7 @@ PythonObject lldb_private::python::SWIGBridge::LLDBSWIGPython_CreateFrameRecogni
 }
 
 PyObject *lldb_private::python::SWIGBridge::LLDBSwigPython_GetRecognizedArguments(
-    PyObject *implementor, const lldb::StackFrameSP &frame_sp) {
+    PyObject * implementor, const lldb::StackFrameSP &frame_sp) {
   static char callee_name[] = "get_recognized_arguments";
 
   PythonObject arg = SWIGBridge::ToSWIGWrapper(frame_sp);
@@ -824,22 +824,6 @@ PyObject *lldb_private::python::SWIGBridge::LLDBSwigPython_GetRecognizedArgument
   return result;
 }
 
-bool lldb_private::python::SWIGBridge::LLDBSwigPython_ShouldHide(
-    PyObject *implementor, const lldb::StackFrameSP &frame_sp) {
-  static char callee_name[] = "should_hide";
-
-  PythonObject arg = SWIGBridge::ToSWIGWrapper(frame_sp);
-
-  PythonString str(callee_name);
-
-  PyObject *result =
-      PyObject_CallMethodObjArgs(implementor, str.get(), arg.get(), NULL);
-  bool ret_val = result ? PyObject_IsTrue(result) : false;
-  Py_XDECREF(result);
-
-  return result;
-}
-
 void *lldb_private::python::SWIGBridge::LLDBSWIGPython_GetDynamicSetting(
     void *module, const char *setting, const lldb::TargetSP &target_sp) {
   if (!module || !setting)

diff  --git a/lldb/include/lldb/API/SBFrame.h b/lldb/include/lldb/API/SBFrame.h
index e0d15c3ecc5b1c..821ff3cf7ce519 100644
--- a/lldb/include/lldb/API/SBFrame.h
+++ b/lldb/include/lldb/API/SBFrame.h
@@ -104,10 +104,6 @@ class LLDB_API SBFrame {
 
   bool IsArtificial() const;
 
-  /// Return whether a frame recognizer decided this frame should not
-  /// be displayes in backtraces etc.
-  bool IsHidden() const;
-
   /// The version that doesn't supply a 'use_dynamic' value will use the
   /// target's default.
   lldb::SBValue EvaluateExpression(const char *expr);

diff  --git a/lldb/include/lldb/Interpreter/ScriptInterpreter.h b/lldb/include/lldb/Interpreter/ScriptInterpreter.h
index 89a480a28880aa..05f0d7f0955f3e 100644
--- a/lldb/include/lldb/Interpreter/ScriptInterpreter.h
+++ b/lldb/include/lldb/Interpreter/ScriptInterpreter.h
@@ -252,11 +252,6 @@ class ScriptInterpreter : public PluginInterface {
     return lldb::ValueObjectListSP();
   }
 
-  virtual bool ShouldHide(const StructuredData::ObjectSP &implementor,
-                          lldb::StackFrameSP frame_sp) {
-    return false;
-  }
-
   virtual StructuredData::GenericSP
   CreateScriptedBreakpointResolver(const char *class_name,
                                    const StructuredDataImpl &args_data,

diff  --git a/lldb/include/lldb/Target/StackFrame.h b/lldb/include/lldb/Target/StackFrame.h
index e4d17847763acf..52f0a1ee662176 100644
--- a/lldb/include/lldb/Target/StackFrame.h
+++ b/lldb/include/lldb/Target/StackFrame.h
@@ -407,11 +407,6 @@ class StackFrame : public ExecutionContextScope,
   /// may have limited support for inspecting variables.
   bool IsArtificial() const;
 
-  /// Query whether this frame should be hidden from backtraces. Frame
-  /// recognizers can customize this behavior and hide distracting
-  /// system implementation details this way.
-  bool IsHidden();
-
   /// Query this frame to find what frame it is in this Thread's
   /// StackFrameList.
   ///
@@ -523,36 +518,33 @@ class StackFrame : public ExecutionContextScope,
   bool HasCachedData() const;
 
 private:
-  /// For StackFrame only.
-  /// \{
+  // For StackFrame only
   lldb::ThreadWP m_thread_wp;
   uint32_t m_frame_index;
   uint32_t m_concrete_frame_index;
   lldb::RegisterContextSP m_reg_context_sp;
   StackID m_id;
-  /// \}
-
-  /// The frame code address (might not be the same as the actual PC
-  /// for inlined frames) as a section/offset address.
-  Address m_frame_code_addr;
+  Address m_frame_code_addr; // The frame code address (might not be the same as
+                             // the actual PC for inlined frames) as a
+                             // section/offset address
   SymbolContext m_sc;
   Flags m_flags;
   Scalar m_frame_base;
   Status m_frame_base_error;
-  uint16_t m_frame_recognizer_generation;
-  /// Does this frame have a CFA?  Different from CFA == LLDB_INVALID_ADDRESS.
-  bool m_cfa_is_valid;
+  bool m_cfa_is_valid; // Does this frame have a CFA?  Different from CFA ==
+                       // LLDB_INVALID_ADDRESS
   Kind m_stack_frame_kind;
 
-  /// Whether this frame behaves like the zeroth frame, in the sense
-  /// that its pc value might not immediately follow a call (and thus might
-  /// be the first address of its function). True for actual frame zero as
-  /// well as any other frame with the same trait.
+  // Whether this frame behaves like the zeroth frame, in the sense
+  // that its pc value might not immediately follow a call (and thus might
+  // be the first address of its function). True for actual frame zero as
+  // well as any other frame with the same trait.
   bool m_behaves_like_zeroth_frame;
   lldb::VariableListSP m_variable_list_sp;
-  /// Value objects for each variable in m_variable_list_sp.
-  ValueObjectList m_variable_list_value_objects;
-  std::optional<lldb::RecognizedStackFrameSP> m_recognized_frame_sp;
+  ValueObjectList m_variable_list_value_objects; // Value objects for each
+                                                 // variable in
+                                                 // m_variable_list_sp
+  lldb::RecognizedStackFrameSP m_recognized_frame_sp;
   StreamString m_disassembly;
   std::recursive_mutex m_mutex;
 

diff  --git a/lldb/include/lldb/Target/StackFrameList.h b/lldb/include/lldb/Target/StackFrameList.h
index 7d0e7a5b9a71b2..88e211ff692bd9 100644
--- a/lldb/include/lldb/Target/StackFrameList.h
+++ b/lldb/include/lldb/Target/StackFrameList.h
@@ -91,7 +91,7 @@ class StackFrameList {
 
   size_t GetStatus(Stream &strm, uint32_t first_frame, uint32_t num_frames,
                    bool show_frame_info, uint32_t num_frames_with_source,
-                   bool show_unique = false, bool show_hidden = false,
+                   bool show_unique = false,
                    const char *frame_marker = nullptr);
 
 protected:

diff  --git a/lldb/include/lldb/Target/StackFrameRecognizer.h b/lldb/include/lldb/Target/StackFrameRecognizer.h
index 8acebc12c4b1dc..e9ac2750192ef6 100644
--- a/lldb/include/lldb/Target/StackFrameRecognizer.h
+++ b/lldb/include/lldb/Target/StackFrameRecognizer.h
@@ -17,7 +17,6 @@
 #include "lldb/lldb-private-forward.h"
 #include "lldb/lldb-public.h"
 
-#include <cstdint>
 #include <deque>
 #include <optional>
 #include <vector>
@@ -29,23 +28,20 @@ namespace lldb_private {
 /// This class provides extra information about a stack frame that was
 /// provided by a specific stack frame recognizer. Right now, this class only
 /// holds recognized arguments (via GetRecognizedArguments).
+
 class RecognizedStackFrame
     : public std::enable_shared_from_this<RecognizedStackFrame> {
 public:
-  virtual ~RecognizedStackFrame() = default;
-
   virtual lldb::ValueObjectListSP GetRecognizedArguments() {
     return m_arguments;
   }
   virtual lldb::ValueObjectSP GetExceptionObject() {
     return lldb::ValueObjectSP();
   }
-  virtual lldb::StackFrameSP GetMostRelevantFrame() { return nullptr; }
+  virtual lldb::StackFrameSP GetMostRelevantFrame() { return nullptr; };
+  virtual ~RecognizedStackFrame() = default;
 
   std::string GetStopDescription() { return m_stop_desc; }
-  /// Controls whether this frame should be filtered out when
-  /// displaying backtraces, for example.
-  virtual bool ShouldHide() { return false; }
 
 protected:
   lldb::ValueObjectListSP m_arguments;
@@ -57,6 +53,7 @@ class RecognizedStackFrame
 /// A base class for frame recognizers. Subclasses (actual frame recognizers)
 /// should implement RecognizeFrame to provide a RecognizedStackFrame for a
 /// given stack frame.
+
 class StackFrameRecognizer
     : public std::enable_shared_from_this<StackFrameRecognizer> {
 public:
@@ -76,10 +73,10 @@ class StackFrameRecognizer
 /// Python implementation for frame recognizers. An instance of this class
 /// tracks a particular Python classobject, which will be asked to recognize
 /// stack frames.
+
 class ScriptedStackFrameRecognizer : public StackFrameRecognizer {
   lldb_private::ScriptInterpreter *m_interpreter;
   lldb_private::StructuredData::ObjectSP m_python_object_sp;
-
   std::string m_python_class;
 
 public:
@@ -126,14 +123,8 @@ class StackFrameRecognizerManager {
   lldb::StackFrameRecognizerSP GetRecognizerForFrame(lldb::StackFrameSP frame);
 
   lldb::RecognizedStackFrameSP RecognizeFrame(lldb::StackFrameSP frame);
-  /// Returns a number that changes whenever the list of recognizers
-  /// has been modified.
-  uint16_t GetGeneration() const { return m_generation; }
 
 private:
-  /// Increase the generation counter.
-  void BumpGeneration();
-
   struct RegisteredEntry {
     uint32_t recognizer_id;
     lldb::StackFrameRecognizerSP recognizer;
@@ -146,7 +137,6 @@ class StackFrameRecognizerManager {
   };
 
   std::deque<RegisteredEntry> m_recognizers;
-  uint16_t m_generation;
 };
 
 /// \class ValueObjectRecognizerSynthesizedValue
@@ -154,6 +144,7 @@ class StackFrameRecognizerManager {
 /// ValueObject subclass that presents the passed ValueObject as a recognized
 /// value with the specified ValueType. Frame recognizers should return
 /// instances of this class as the returned objects in GetRecognizedArguments().
+
 class ValueObjectRecognizerSynthesizedValue : public ValueObject {
  public:
   static lldb::ValueObjectSP Create(ValueObject &parent, lldb::ValueType type) {

diff  --git a/lldb/include/lldb/Target/Thread.h b/lldb/include/lldb/Target/Thread.h
index 38b65b2bc58490..aacc59c292ec79 100644
--- a/lldb/include/lldb/Target/Thread.h
+++ b/lldb/include/lldb/Target/Thread.h
@@ -1128,11 +1128,11 @@ class Thread : public std::enable_shared_from_this<Thread>,
 
   size_t GetStatus(Stream &strm, uint32_t start_frame, uint32_t num_frames,
                    uint32_t num_frames_with_source, bool stop_format,
-                   bool show_hidden, bool only_stacks = false);
+                   bool only_stacks = false);
 
   size_t GetStackFrameStatus(Stream &strm, uint32_t first_frame,
                              uint32_t num_frames, bool show_frame_info,
-                             uint32_t num_frames_with_source, bool show_hidden);
+                             uint32_t num_frames_with_source);
 
   // We need a way to verify that even though we have a thread in a shared
   // pointer that the object itself is still valid. Currently this won't be the

diff  --git a/lldb/source/API/SBFrame.cpp b/lldb/source/API/SBFrame.cpp
index 2689ecb2ab7bc7..47fc88625e30c5 100644
--- a/lldb/source/API/SBFrame.cpp
+++ b/lldb/source/API/SBFrame.cpp
@@ -1195,24 +1195,13 @@ bool SBFrame::IsArtificial() const {
   std::unique_lock<std::recursive_mutex> lock;
   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
 
-  if (StackFrame *frame = exe_ctx.GetFramePtr())
+  StackFrame *frame = exe_ctx.GetFramePtr();
+  if (frame)
     return frame->IsArtificial();
 
   return false;
 }
 
-bool SBFrame::IsHidden() const {
-  LLDB_INSTRUMENT_VA(this);
-
-  std::unique_lock<std::recursive_mutex> lock;
-  ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
-
-  if (StackFrame *frame = exe_ctx.GetFramePtr())
-    return frame->IsHidden();
-
-  return false;
-}
-
 const char *SBFrame::GetFunctionName() {
   LLDB_INSTRUMENT_VA(this);
 

diff  --git a/lldb/source/API/SBThread.cpp b/lldb/source/API/SBThread.cpp
index 140a2920f05673..786f62bd66d520 100644
--- a/lldb/source/API/SBThread.cpp
+++ b/lldb/source/API/SBThread.cpp
@@ -1208,8 +1208,7 @@ bool SBThread::GetStatus(SBStream &status) const {
   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
 
   if (exe_ctx.HasThreadScope()) {
-    exe_ctx.GetThreadPtr()->GetStatus(strm, 0, 1, 1, true,
-                                      /*show_hidden=*/true);
+    exe_ctx.GetThreadPtr()->GetStatus(strm, 0, 1, 1, true);
   } else
     strm.PutCString("No status");
 

diff  --git a/lldb/source/Commands/CommandCompletions.cpp b/lldb/source/Commands/CommandCompletions.cpp
index 216aaf9abce6cf..54f4b368166492 100644
--- a/lldb/source/Commands/CommandCompletions.cpp
+++ b/lldb/source/Commands/CommandCompletions.cpp
@@ -791,7 +791,7 @@ void CommandCompletions::ThreadIndexes(CommandInterpreter &interpreter,
   lldb::ThreadSP thread_sp;
   for (uint32_t idx = 0; (thread_sp = threads.GetThreadAtIndex(idx)); ++idx) {
     StreamString strm;
-    thread_sp->GetStatus(strm, 0, 1, 1, true, /*show_hidden*/ true);
+    thread_sp->GetStatus(strm, 0, 1, 1, true);
     request.TryCompleteCurrentArg(std::to_string(thread_sp->GetIndexID()),
                                   strm.GetString());
   }
@@ -835,7 +835,7 @@ void CommandCompletions::ThreadIDs(CommandInterpreter &interpreter,
   lldb::ThreadSP thread_sp;
   for (uint32_t idx = 0; (thread_sp = threads.GetThreadAtIndex(idx)); ++idx) {
     StreamString strm;
-    thread_sp->GetStatus(strm, 0, 1, 1, true, /*show_hidden*/ true);
+    thread_sp->GetStatus(strm, 0, 1, 1, true);
     request.TryCompleteCurrentArg(std::to_string(thread_sp->GetID()),
                                   strm.GetString());
   }

diff  --git a/lldb/source/Commands/CommandObjectFrame.cpp b/lldb/source/Commands/CommandObjectFrame.cpp
index 46c75e3dd159c0..29e460fe3885ff 100644
--- a/lldb/source/Commands/CommandObjectFrame.cpp
+++ b/lldb/source/Commands/CommandObjectFrame.cpp
@@ -278,30 +278,6 @@ class CommandObjectFrameSelect : public CommandObjectParsed {
       if (frame_idx == UINT32_MAX)
         frame_idx = 0;
 
-      // If moving up/down by one, skip over hidden frames.
-      if (*m_options.relative_frame_offset == 1 ||
-          *m_options.relative_frame_offset == -1) {
-        uint32_t candidate_idx = frame_idx;
-        const unsigned max_depth = 12;
-        for (unsigned num_try = 0; num_try < max_depth; ++num_try) {
-          if (candidate_idx == 0 && *m_options.relative_frame_offset == -1) {
-            candidate_idx = UINT32_MAX;
-            break;
-          }
-          candidate_idx += *m_options.relative_frame_offset;
-          if (auto candidate_sp = thread->GetStackFrameAtIndex(candidate_idx)) {
-            if (candidate_sp->IsHidden())
-              continue;
-            // Now candidate_idx is the first non-hidden frame.
-            break;
-          }
-          candidate_idx = UINT32_MAX;
-          break;
-        };
-        if (candidate_idx != UINT32_MAX)
-          m_options.relative_frame_offset = candidate_idx - frame_idx;
-      }
-
       if (*m_options.relative_frame_offset < 0) {
         if (static_cast<int32_t>(frame_idx) >=
             -*m_options.relative_frame_offset)

diff  --git a/lldb/source/Commands/CommandObjectMemory.cpp b/lldb/source/Commands/CommandObjectMemory.cpp
index baf5d9196e553e..137b1ad981073c 100644
--- a/lldb/source/Commands/CommandObjectMemory.cpp
+++ b/lldb/source/Commands/CommandObjectMemory.cpp
@@ -1570,8 +1570,7 @@ class CommandObjectMemoryHistory : public CommandObjectParsed {
 
     const bool stop_format = false;
     for (auto thread : thread_list) {
-      thread->GetStatus(*output_stream, 0, UINT32_MAX, 0, stop_format,
-                        /*should_filter*/ false);
+      thread->GetStatus(*output_stream, 0, UINT32_MAX, 0, stop_format);
     }
 
     result.SetStatus(eReturnStatusSuccessFinishResult);

diff  --git a/lldb/source/Commands/CommandObjectThread.cpp b/lldb/source/Commands/CommandObjectThread.cpp
index 6a89c163f37d51..605f872a9f45e1 100644
--- a/lldb/source/Commands/CommandObjectThread.cpp
+++ b/lldb/source/Commands/CommandObjectThread.cpp
@@ -89,9 +89,6 @@ class CommandObjectThreadBacktrace : public CommandObjectIterateOverThreads {
               "invalid boolean value for option '%c': %s", short_option,
               option_arg.data());
       } break;
-      case 'u':
-        m_filtered_backtrace = false;
-        break;
       default:
         llvm_unreachable("Unimplemented option");
       }
@@ -102,7 +99,6 @@ class CommandObjectThreadBacktrace : public CommandObjectIterateOverThreads {
       m_count = UINT32_MAX;
       m_start = 0;
       m_extended_backtrace = false;
-      m_filtered_backtrace = true;
     }
 
     llvm::ArrayRef<OptionDefinition> GetDefinitions() override {
@@ -113,7 +109,6 @@ class CommandObjectThreadBacktrace : public CommandObjectIterateOverThreads {
     uint32_t m_count;
     uint32_t m_start;
     bool m_extended_backtrace;
-    bool m_filtered_backtrace;
   };
 
   CommandObjectThreadBacktrace(CommandInterpreter &interpreter)
@@ -126,10 +121,7 @@ class CommandObjectThreadBacktrace : public CommandObjectIterateOverThreads {
             "call stacks.\n"
             "Use 'settings set frame-format' to customize the printing of "
             "frames in the backtrace and 'settings set thread-format' to "
-            "customize the thread header.\n"
-            "Customizable frame recognizers may filter out less interesting "
-            "frames, which results in gaps in the numbering. "
-            "Use '-u' to see all frames.",
+            "customize the thread header.",
             nullptr,
             eCommandRequiresProcess | eCommandRequiresThread |
                 eCommandTryTargetAPILock | eCommandProcessMustBeLaunched |
@@ -207,8 +199,7 @@ class CommandObjectThreadBacktrace : public CommandObjectIterateOverThreads {
           strm.PutChar('\n');
           if (ext_thread_sp->GetStatus(strm, m_options.m_start,
                                        m_options.m_count,
-                                       num_frames_with_source, stop_format,
-                                       !m_options.m_filtered_backtrace)) {
+                                       num_frames_with_source, stop_format)) {
             DoExtendedBacktrace(ext_thread_sp.get(), result);
           }
         }
@@ -237,8 +228,7 @@ class CommandObjectThreadBacktrace : public CommandObjectIterateOverThreads {
     const uint32_t num_frames_with_source = 0;
     const bool stop_format = true;
     if (!thread->GetStatus(strm, m_options.m_start, m_options.m_count,
-                           num_frames_with_source, stop_format,
-                           !m_options.m_filtered_backtrace, only_stacks)) {
+                           num_frames_with_source, stop_format, only_stacks)) {
       result.AppendErrorWithFormat(
           "error displaying backtrace for thread: \"0x%4.4x\"\n",
           thread->GetIndexID());
@@ -1402,8 +1392,7 @@ class CommandObjectThreadException : public CommandObjectIterateOverThreads {
       const uint32_t num_frames_with_source = 0;
       const bool stop_format = false;
       exception_thread_sp->GetStatus(strm, 0, UINT32_MAX,
-                                     num_frames_with_source, stop_format,
-                                     /*filtered*/ false);
+                                     num_frames_with_source, stop_format);
     }
 
     return true;

diff  --git a/lldb/source/Commands/Options.td b/lldb/source/Commands/Options.td
index 9c4dbed6939ba9..f050cd2ebb5ae0 100644
--- a/lldb/source/Commands/Options.td
+++ b/lldb/source/Commands/Options.td
@@ -1048,8 +1048,6 @@ let Command = "thread backtrace" in {
   Arg<"FrameIndex">, Desc<"Frame in which to start the backtrace">;
   def thread_backtrace_extended : Option<"extended", "e">, Group<1>,
   Arg<"Boolean">, Desc<"Show the extended backtrace, if available">;
-  def thread_backtrace_unfiltered : Option<"unfiltered", "u">, Group<1>,
-  Desc<"Filter out frames according to installed frame recognizers">;
 }
 
 let Command = "thread step scope" in {

diff  --git a/lldb/source/Core/Debugger.cpp b/lldb/source/Core/Debugger.cpp
index 67f01707a2afee..309e01e456580c 100644
--- a/lldb/source/Core/Debugger.cpp
+++ b/lldb/source/Core/Debugger.cpp
@@ -1869,8 +1869,7 @@ void Debugger::HandleThreadEvent(const EventSP &event_sp) {
     ThreadSP thread_sp(
         Thread::ThreadEventData::GetThreadFromEvent(event_sp.get()));
     if (thread_sp) {
-      thread_sp->GetStatus(*GetAsyncOutputStream(), 0, 1, 1, stop_format,
-                           /*show_hidden*/ true);
+      thread_sp->GetStatus(*GetAsyncOutputStream(), 0, 1, 1, stop_format);
     }
   }
 }

diff  --git a/lldb/source/Interpreter/CommandInterpreter.cpp b/lldb/source/Interpreter/CommandInterpreter.cpp
index 87298803e8415a..e45112530404b8 100644
--- a/lldb/source/Interpreter/CommandInterpreter.cpp
+++ b/lldb/source/Interpreter/CommandInterpreter.cpp
@@ -835,12 +835,11 @@ void CommandInterpreter::LoadCommandDictionary() {
   std::unique_ptr<CommandObjectRegexCommand> bt_regex_cmd_up(
       new CommandObjectRegexCommand(
           *this, "_regexp-bt",
-          "Show backtrace of the current thread's call stack. Any numeric "
-          "argument displays at most that many frames. The argument 'all' "
-          "displays all threads. Use 'settings set frame-format' to customize "
+          "Show backtrace of the current thread's call stack.  Any numeric "
+          "argument displays at most that many frames.  The argument 'all' "
+          "displays all threads.  Use 'settings set frame-format' to customize "
           "the printing of individual frames and 'settings set thread-format' "
-          "to customize the thread header. Frame recognizers may filter the"
-          "list. Use 'thread backtrace -u (--unfiltered)' to see them all.",
+          "to customize the thread header.",
           "bt [<digit> | all]", 0, false));
   if (bt_regex_cmd_up) {
     // accept but don't document "bt -c <number>" -- before bt was a regex

diff  --git a/lldb/source/Plugins/LanguageRuntime/CPlusPlus/CPPLanguageRuntime.cpp b/lldb/source/Plugins/LanguageRuntime/CPlusPlus/CPPLanguageRuntime.cpp
index c60200ab186d09..c7202a47d0157e 100644
--- a/lldb/source/Plugins/LanguageRuntime/CPlusPlus/CPPLanguageRuntime.cpp
+++ b/lldb/source/Plugins/LanguageRuntime/CPlusPlus/CPPLanguageRuntime.cpp
@@ -26,7 +26,6 @@
 #include "lldb/Target/RegisterContext.h"
 #include "lldb/Target/SectionLoadList.h"
 #include "lldb/Target/StackFrame.h"
-#include "lldb/Target/StackFrameRecognizer.h"
 #include "lldb/Target/ThreadPlanRunToAddress.h"
 #include "lldb/Target/ThreadPlanStepInRange.h"
 #include "lldb/Utility/Timer.h"
@@ -41,49 +40,8 @@ static ConstString g_coro_frame = ConstString("__coro_frame");
 
 char CPPLanguageRuntime::ID = 0;
 
-/// A frame recognizer that is installed to hide libc++ implementation
-/// details from the backtrace.
-class LibCXXFrameRecognizer : public StackFrameRecognizer {
-  RegularExpression m_hidden_function_regex;
-  RecognizedStackFrameSP m_hidden_frame;
-
-  struct LibCXXHiddenFrame : public RecognizedStackFrame {
-    bool ShouldHide() override { return true; }
-  };
-
-public:
-  LibCXXFrameRecognizer()
-      : m_hidden_function_regex(
-            R"(^std::__1::(__function.*::operator\(\)|__invoke))"
-            R"((\[.*\])?)"    // ABI tag.
-            R"(( const)?$)"), // const.
-        m_hidden_frame(new LibCXXHiddenFrame()) {}
-
-  std::string GetName() override { return "libc++ frame recognizer"; }
-
-  lldb::RecognizedStackFrameSP
-  RecognizeFrame(lldb::StackFrameSP frame_sp) override {
-    if (!frame_sp)
-      return {};
-    const auto &sc = frame_sp->GetSymbolContext(lldb::eSymbolContextFunction);
-    if (!sc.function)
-      return {};
-
-    if (m_hidden_function_regex.Execute(sc.function->GetNameNoArguments()))
-      return m_hidden_frame;
-
-    return {};
-  }
-};
-
 CPPLanguageRuntime::CPPLanguageRuntime(Process *process)
-    : LanguageRuntime(process) {
-  if (process)
-    process->GetTarget().GetFrameRecognizerManager().AddRecognizer(
-        StackFrameRecognizerSP(new LibCXXFrameRecognizer()), {},
-        std::make_shared<RegularExpression>("^std::__1::"),
-        /*first_instruction_only*/ false);
-}
+    : LanguageRuntime(process) {}
 
 bool CPPLanguageRuntime::IsAllowedRuntimeValue(ConstString name) {
   return name == g_this || name == g_promise || name == g_coro_frame;

diff  --git a/lldb/source/Plugins/ScriptInterpreter/Python/SWIGPythonBridge.h b/lldb/source/Plugins/ScriptInterpreter/Python/SWIGPythonBridge.h
index 5351c1a698b4a7..3026b6113ae8f3 100644
--- a/lldb/source/Plugins/ScriptInterpreter/Python/SWIGPythonBridge.h
+++ b/lldb/source/Plugins/ScriptInterpreter/Python/SWIGPythonBridge.h
@@ -227,9 +227,6 @@ class SWIGBridge {
   LLDBSwigPython_GetRecognizedArguments(PyObject *implementor,
                                         const lldb::StackFrameSP &frame_sp);
 
-  static bool LLDBSwigPython_ShouldHide(PyObject *implementor,
-                                        const lldb::StackFrameSP &frame_sp);
-
   static bool LLDBSWIGPythonRunScriptKeywordProcess(
       const char *python_function_name, const char *session_dictionary_name,
       const lldb::ProcessSP &process, std::string &output);

diff  --git a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp
index 2a94f110910400..335c482f8495ad 100644
--- a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp
+++ b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp
@@ -1524,35 +1524,6 @@ lldb::ValueObjectListSP ScriptInterpreterPythonImpl::GetRecognizedArguments(
   return ValueObjectListSP();
 }
 
-bool ScriptInterpreterPythonImpl::ShouldHide(
-    const StructuredData::ObjectSP &os_plugin_object_sp,
-    lldb::StackFrameSP frame_sp) {
-  Locker py_lock(this, Locker::AcquireLock | Locker::NoSTDIN, Locker::FreeLock);
-
-  if (!os_plugin_object_sp)
-    return false;
-
-  StructuredData::Generic *generic = os_plugin_object_sp->GetAsGeneric();
-  if (!generic)
-    return false;
-
-  PythonObject implementor(PyRefType::Borrowed,
-                           (PyObject *)generic->GetValue());
-
-  if (!implementor.IsAllocated())
-    return false;
-
-  bool result =
-      SWIGBridge::LLDBSwigPython_ShouldHide(implementor.get(), frame_sp);
-
-  // if it fails, print the error but otherwise go on
-  if (PyErr_Occurred()) {
-    PyErr_Print();
-    PyErr_Clear();
-  }
-  return result;
-}
-
 ScriptedProcessInterfaceUP
 ScriptInterpreterPythonImpl::CreateScriptedProcessInterface() {
   return std::make_unique<ScriptedProcessPythonInterface>(*this);

diff  --git a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPythonImpl.h b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPythonImpl.h
index 85d79955e45efc..c2024efb395d70 100644
--- a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPythonImpl.h
+++ b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPythonImpl.h
@@ -107,9 +107,6 @@ class ScriptInterpreterPythonImpl : public ScriptInterpreterPython {
   GetRecognizedArguments(const StructuredData::ObjectSP &implementor,
                          lldb::StackFrameSP frame_sp) override;
 
-  bool ShouldHide(const StructuredData::ObjectSP &implementor,
-                  lldb::StackFrameSP frame_sp) override;
-
   lldb::ScriptedProcessInterfaceUP CreateScriptedProcessInterface() override;
 
   lldb::ScriptedThreadInterfaceSP CreateScriptedThreadInterface() override;

diff  --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp
index b2a0f13b9a1549..3c9247fdbbbc96 100644
--- a/lldb/source/Target/Process.cpp
+++ b/lldb/source/Target/Process.cpp
@@ -5545,8 +5545,7 @@ Process::RunThreadPlan(ExecutionContext &exe_ctx,
       // Print a backtrace into the log so we can figure out where we are:
       StreamString s;
       s.PutCString("Thread state after unsuccessful completion: \n");
-      thread->GetStackFrameStatus(s, 0, UINT32_MAX, true, UINT32_MAX,
-                                  /*show_hidden*/ true);
+      thread->GetStackFrameStatus(s, 0, UINT32_MAX, true, UINT32_MAX);
       log->PutString(s.GetString());
     }
     // Restore the thread state if we are going to discard the plan execution.
@@ -5820,8 +5819,8 @@ size_t Process::GetThreadStatus(Stream &strm,
           continue;
       }
       thread_sp->GetStatus(strm, start_frame, num_frames,
-                           num_frames_with_source, stop_format,
-                           /*show_hidden*/ num_frames <= 1);
+                           num_frames_with_source,
+                           stop_format);
       ++num_thread_infos_dumped;
     } else {
       Log *log = GetLog(LLDBLog::Process);

diff  --git a/lldb/source/Target/StackFrame.cpp b/lldb/source/Target/StackFrame.cpp
index 0ebaf555f86beb..3a2b4d05b28810 100644
--- a/lldb/source/Target/StackFrame.cpp
+++ b/lldb/source/Target/StackFrame.cpp
@@ -1198,12 +1198,6 @@ bool StackFrame::IsArtificial() const {
   return m_stack_frame_kind == StackFrame::Kind::Artificial;
 }
 
-bool StackFrame::IsHidden() {
-  if (auto recognized_frame_sp = GetRecognizedFrame())
-    return recognized_frame_sp->ShouldHide();
-  return false;
-}
-
 SourceLanguage StackFrame::GetLanguage() {
   CompileUnit *cu = GetSymbolContext(eSymbolContextCompUnit).comp_unit;
   if (cu)
@@ -1977,16 +1971,12 @@ bool StackFrame::GetStatus(Stream &strm, bool show_frame_info, bool show_source,
 }
 
 RecognizedStackFrameSP StackFrame::GetRecognizedFrame() {
-  auto process = GetThread()->GetProcess();
-  if (!process)
-    return {};
-  // If recognizer list has been modified, discard cache.
-  auto &manager = process->GetTarget().GetFrameRecognizerManager();
-  auto new_generation = manager.GetGeneration();
-  if (m_frame_recognizer_generation != new_generation)
-    m_recognized_frame_sp.reset();
-  m_frame_recognizer_generation = new_generation;
-  if (!m_recognized_frame_sp.has_value())
-    m_recognized_frame_sp = manager.RecognizeFrame(CalculateStackFrame());
-  return m_recognized_frame_sp.value();
+  if (!m_recognized_frame_sp) {
+    m_recognized_frame_sp = GetThread()
+                                ->GetProcess()
+                                ->GetTarget()
+                                .GetFrameRecognizerManager()
+                                .RecognizeFrame(CalculateStackFrame());
+  }
+  return m_recognized_frame_sp;
 }

diff  --git a/lldb/source/Target/StackFrameList.cpp b/lldb/source/Target/StackFrameList.cpp
index 7808bd3674ab19..0cf9ce1bf043f5 100644
--- a/lldb/source/Target/StackFrameList.cpp
+++ b/lldb/source/Target/StackFrameList.cpp
@@ -924,7 +924,7 @@ StackFrameList::GetStackFrameSPForStackFramePtr(StackFrame *stack_frame_ptr) {
 size_t StackFrameList::GetStatus(Stream &strm, uint32_t first_frame,
                                  uint32_t num_frames, bool show_frame_info,
                                  uint32_t num_frames_with_source,
-                                 bool show_unique, bool show_hidden,
+                                 bool show_unique,
                                  const char *selected_frame_marker) {
   size_t num_frames_displayed = 0;
 
@@ -951,6 +951,7 @@ size_t StackFrameList::GetStatus(Stream &strm, uint32_t first_frame,
     unselected_marker = buffer.c_str();
   }
   const char *marker = nullptr;
+
   for (frame_idx = first_frame; frame_idx < last_frame; ++frame_idx) {
     frame_sp = GetFrameAtIndex(frame_idx);
     if (!frame_sp)
@@ -962,11 +963,6 @@ size_t StackFrameList::GetStatus(Stream &strm, uint32_t first_frame,
       else
         marker = unselected_marker;
     }
-
-    // Hide uninteresting frames unless it's the selected frame.
-    if (!show_hidden && frame_sp != selected_frame_sp && frame_sp->IsHidden())
-      continue;
-
     // Check for interruption here.  If we're fetching arguments, this loop
     // can go slowly:
     Debugger &dbg = m_thread.GetProcess()->GetTarget().GetDebugger();

diff  --git a/lldb/source/Target/StackFrameRecognizer.cpp b/lldb/source/Target/StackFrameRecognizer.cpp
index 44411afc65dda9..0ccb1ae9c031e3 100644
--- a/lldb/source/Target/StackFrameRecognizer.cpp
+++ b/lldb/source/Target/StackFrameRecognizer.cpp
@@ -17,14 +17,10 @@ using namespace lldb;
 using namespace lldb_private;
 
 class ScriptedRecognizedStackFrame : public RecognizedStackFrame {
-  bool m_hidden;
-
 public:
-  ScriptedRecognizedStackFrame(ValueObjectListSP args, bool hidden)
-      : m_hidden(hidden) {
-    m_arguments = std::move(args);
+  ScriptedRecognizedStackFrame(ValueObjectListSP args) {
+    m_arguments = args;
   }
-  bool ShouldHide() override { return m_hidden; }
 };
 
 ScriptedStackFrameRecognizer::ScriptedStackFrameRecognizer(
@@ -42,22 +38,13 @@ ScriptedStackFrameRecognizer::RecognizeFrame(lldb::StackFrameSP frame) {
   ValueObjectListSP args =
       m_interpreter->GetRecognizedArguments(m_python_object_sp, frame);
   auto args_synthesized = ValueObjectListSP(new ValueObjectList());
-  if (args) {
-    for (const auto &o : args->GetObjects())
-      args_synthesized->Append(ValueObjectRecognizerSynthesizedValue::Create(
-          *o, eValueTypeVariableArgument));
+  for (const auto &o : args->GetObjects()) {
+    args_synthesized->Append(ValueObjectRecognizerSynthesizedValue::Create(
+        *o, eValueTypeVariableArgument));
   }
 
-  bool hidden = m_interpreter->ShouldHide(m_python_object_sp, frame);
-
   return RecognizedStackFrameSP(
-      new ScriptedRecognizedStackFrame(args_synthesized, hidden));
-}
-
-void StackFrameRecognizerManager::BumpGeneration() {
-  uint32_t n = m_generation;
-  n = (n + 1) & ((1 << 16) - 1);
-  m_generation = n;
+      new ScriptedRecognizedStackFrame(args_synthesized));
 }
 
 void StackFrameRecognizerManager::AddRecognizer(
@@ -66,7 +53,6 @@ void StackFrameRecognizerManager::AddRecognizer(
   m_recognizers.push_front({(uint32_t)m_recognizers.size(), recognizer, false,
                             module, RegularExpressionSP(), symbols,
                             RegularExpressionSP(), first_instruction_only});
-  BumpGeneration();
 }
 
 void StackFrameRecognizerManager::AddRecognizer(
@@ -75,7 +61,6 @@ void StackFrameRecognizerManager::AddRecognizer(
   m_recognizers.push_front({(uint32_t)m_recognizers.size(), recognizer, true,
                             ConstString(), module, std::vector<ConstString>(),
                             symbol, first_instruction_only});
-  BumpGeneration();
 }
 
 void StackFrameRecognizerManager::ForEach(
@@ -112,12 +97,10 @@ bool StackFrameRecognizerManager::RemoveRecognizerWithID(
   if (found == m_recognizers.end())
     return false;
   m_recognizers.erase(found);
-  BumpGeneration();
   return true;
 }
 
 void StackFrameRecognizerManager::RemoveAllRecognizers() {
-  BumpGeneration();
   m_recognizers.clear();
 }
 

diff  --git a/lldb/source/Target/Thread.cpp b/lldb/source/Target/Thread.cpp
index fcf0f4e2519085..74d1a268c6dffb 100644
--- a/lldb/source/Target/Thread.cpp
+++ b/lldb/source/Target/Thread.cpp
@@ -1748,7 +1748,7 @@ std::string Thread::RunModeAsString(lldb::RunMode mode) {
 
 size_t Thread::GetStatus(Stream &strm, uint32_t start_frame,
                          uint32_t num_frames, uint32_t num_frames_with_source,
-                         bool stop_format, bool show_hidden, bool only_stacks) {
+                         bool stop_format, bool only_stacks) {
 
   if (!only_stacks) {
     ExecutionContext exe_ctx(shared_from_this());
@@ -1795,7 +1795,7 @@ size_t Thread::GetStatus(Stream &strm, uint32_t start_frame,
 
     num_frames_shown = GetStackFrameList()->GetStatus(
         strm, start_frame, num_frames, show_frame_info, num_frames_with_source,
-        show_frame_unique, show_hidden, selected_frame_marker);
+        show_frame_unique, selected_frame_marker);
     if (num_frames == 1)
       strm.IndentLess();
     strm.IndentLess();
@@ -1893,11 +1893,9 @@ bool Thread::GetDescription(Stream &strm, lldb::DescriptionLevel level,
 
 size_t Thread::GetStackFrameStatus(Stream &strm, uint32_t first_frame,
                                    uint32_t num_frames, bool show_frame_info,
-                                   uint32_t num_frames_with_source,
-                                   bool show_hidden) {
-  return GetStackFrameList()->GetStatus(strm, first_frame, num_frames,
-                                        show_frame_info, num_frames_with_source,
-                                        /*show_unique*/ false, show_hidden);
+                                   uint32_t num_frames_with_source) {
+  return GetStackFrameList()->GetStatus(
+      strm, first_frame, num_frames, show_frame_info, num_frames_with_source);
 }
 
 Unwind &Thread::GetUnwinder() {

diff  --git a/lldb/source/Target/ThreadPlanStepOut.cpp b/lldb/source/Target/ThreadPlanStepOut.cpp
index 8ca1dbc2fe4c46..0a1e2ae605efcf 100644
--- a/lldb/source/Target/ThreadPlanStepOut.cpp
+++ b/lldb/source/Target/ThreadPlanStepOut.cpp
@@ -58,7 +58,7 @@ ThreadPlanStepOut::ThreadPlanStepOut(
     return; // we can't do anything here.  ValidatePlan() will return false.
 
   // While stepping out, behave as-if artificial frames are not present.
-  while (return_frame_sp->IsArtificial() || return_frame_sp->IsHidden()) {
+  while (return_frame_sp->IsArtificial()) {
     m_stepped_past_frames.push_back(return_frame_sp);
 
     ++return_frame_index;

diff  --git a/lldb/test/API/commands/frame/recognizer/TestFrameRecognizer.py b/lldb/test/API/commands/frame/recognizer/TestFrameRecognizer.py
index 6174ac61a709dd..eea0aafce6e25e 100644
--- a/lldb/test/API/commands/frame/recognizer/TestFrameRecognizer.py
+++ b/lldb/test/API/commands/frame/recognizer/TestFrameRecognizer.py
@@ -162,46 +162,6 @@ def test_frame_recognizer_1(self):
                     substrs=['*a = 78'])
         """
 
-    @skipUnlessDarwin
-    def test_frame_recognizer_hiding(self):
-        self.build()
-
-        target, process, thread, _ = lldbutil.run_to_name_breakpoint(self, "nested")
-        frame = thread.GetSelectedFrame()
-
-        # Sanity check.
-        self.expect(
-            "thread backtrace", patterns=["frame.*nested", "frame.*baz", "frame.*main"]
-        )
-
-        self.expect("frame recognizer clear")
-        self.expect(
-            "command script import "
-            + os.path.join(self.getSourceDir(), "recognizer.py")
-        )
-
-        self.expect(
-            "frame recognizer add -l recognizer.BazFrameRecognizer -f false -s a.out -n baz"
-        )
-
-        self.expect(
-            "frame recognizer list",
-            substrs=["0: recognizer.BazFrameRecognizer"],
-        )
-
-        # Now main should be hidden.
-        self.expect("thread backtrace", matching=False, patterns=["frame.*baz"])
-        self.assertFalse(frame.IsHidden())
-        frame = thread.SetSelectedFrame(1)
-        self.assertIn("baz", frame.name)
-        self.assertTrue(frame.IsHidden())
-
-        # Test StepOut.
-        frame = thread.SetSelectedFrame(0)
-        thread.StepOut()
-        frame = thread.GetSelectedFrame()
-        self.assertIn("main", frame.name)
-
     @skipUnlessDarwin
     def test_frame_recognizer_multi_symbol(self):
         self.build()

diff  --git a/lldb/test/API/commands/frame/recognizer/main.m b/lldb/test/API/commands/frame/recognizer/main.m
index 74d219f1fff4c5..6546692bba772e 100644
--- a/lldb/test/API/commands/frame/recognizer/main.m
+++ b/lldb/test/API/commands/frame/recognizer/main.m
@@ -1,17 +1,16 @@
 #import <stdio.h>
 
-void foo(int a, int b) { printf("%d %d\n", a, b); }
+void foo(int a, int b)
+{
+    printf("%d %d\n", a, b);
+}
 
 void bar(int *ptr) { printf("%d\n", *ptr); }
 
-void nested(int *ptr) { bar(ptr); }
-
-void baz(int *ptr) { nested(ptr); }
-
-int main(int argc, const char *argv[]) {
-  foo(42, 56);
-  int i = 78;
-  bar(&i);
-  baz(&i);
-  return 0;
+int main (int argc, const char * argv[])
+{
+    foo(42, 56);
+    int i = 78;
+    bar(&i);
+    return 0;
 }

diff  --git a/lldb/test/API/commands/frame/recognizer/recognizer.py b/lldb/test/API/commands/frame/recognizer/recognizer.py
index 98666b720b1e2b..1a2a2d5c265070 100644
--- a/lldb/test/API/commands/frame/recognizer/recognizer.py
+++ b/lldb/test/API/commands/frame/recognizer/recognizer.py
@@ -36,8 +36,3 @@ def get_recognized_arguments(self, frame):
 class MyOtherFrameRecognizer(object):
     def get_recognized_arguments(self, frame):
         return []
-
-
-class BazFrameRecognizer(object):
-    def should_hide(self, frame):
-        return "baz" in frame.name

diff  --git a/lldb/test/API/lang/cpp/std-function-recognizer/Makefile b/lldb/test/API/lang/cpp/std-function-recognizer/Makefile
deleted file mode 100644
index ab034edd121f9f..00000000000000
--- a/lldb/test/API/lang/cpp/std-function-recognizer/Makefile
+++ /dev/null
@@ -1,4 +0,0 @@
-CXX_SOURCES := main.cpp
-USE_LIBCPP := 1
-
-include Makefile.rules

diff  --git a/lldb/test/API/lang/cpp/std-function-recognizer/TestStdFunctionRecognizer.py b/lldb/test/API/lang/cpp/std-function-recognizer/TestStdFunctionRecognizer.py
deleted file mode 100644
index 30fe3ecb1e4bf4..00000000000000
--- a/lldb/test/API/lang/cpp/std-function-recognizer/TestStdFunctionRecognizer.py
+++ /dev/null
@@ -1,84 +0,0 @@
-import lldb
-from lldbsuite.test.decorators import *
-from lldbsuite.test.lldbtest import *
-from lldbsuite.test import lldbutil
-
-
-class LibCxxStdFunctionRecognizerTestCase(TestBase):
-    NO_DEBUG_INFO_TESTCASE = True
-
-    @add_test_categories(["libc++"])
-    def test_backtrace(self):
-        """Test that std::function implementation details are hidden in bt"""
-        self.build()
-        (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(
-            self, "// break here", lldb.SBFileSpec("main.cpp")
-        )
-        # Filtered.
-        self.expect(
-            "thread backtrace",
-            ordered=True,
-            substrs=["frame", "foo", "frame", "main"],
-        )
-        self.expect(
-            "thread backtrace", matching=False, patterns=["frame.*std::__1::__function"]
-        )
-        # Unfiltered.
-        self.expect(
-            "thread backtrace -u",
-            ordered=True,
-            patterns=["frame.*foo", "frame.*std::__1::__function", "frame.*main"],
-        )
-        self.expect(
-            "thread backtrace --unfiltered",
-            ordered=True,
-            patterns=["frame.*foo", "frame.*std::__1::__function", "frame.*main"],
-        )
-
-    @add_test_categories(["libc++"])
-    def test_up_down(self):
-        """Test that std::function implementation details are skipped"""
-        self.build()
-        (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(
-            self, "// break here", lldb.SBFileSpec("main.cpp")
-        )
-        frame = thread.GetSelectedFrame()
-        # up
-        self.assertIn("foo", frame.GetFunctionName())
-        start_idx = frame.GetFrameID()
-        i = 0
-        while i < thread.GetNumFrames():
-            self.expect("up")
-            frame = thread.GetSelectedFrame()
-            if frame.GetFunctionName() == "main":
-                break
-        end_idx = frame.GetFrameID()
-        self.assertLess(i, end_idx - start_idx, "skipped frames")
-
-        # Back down again.
-        start_idx = frame.GetFrameID()
-        for i in range(1, thread.GetNumFrames()):
-            self.expect("down")
-            frame = thread.GetSelectedFrame()
-            if "foo" in frame.GetFunctionName():
-                break
-        end_idx = frame.GetFrameID()
-        self.assertLess(i, start_idx - end_idx, "skipped frames")
-
-    @add_test_categories(["libc++"])
-    def test_api(self):
-        """Test that std::function implementation details are skipped"""
-        self.build()
-        (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(
-            self, "// break here", lldb.SBFileSpec("main.cpp")
-        )
-        frame = thread.GetSelectedFrame()
-        num_hidden = 0
-        for i in range(1, thread.GetNumFrames()):
-            thread.SetSelectedFrame(i)
-            frame = thread.GetSelectedFrame()
-            if frame.IsHidden():
-                num_hidden += 1
-
-        self.assertGreater(num_hidden, 0)
-        self.assertLess(num_hidden, thread.GetNumFrames())

diff  --git a/lldb/test/API/lang/cpp/std-function-recognizer/main.cpp b/lldb/test/API/lang/cpp/std-function-recognizer/main.cpp
deleted file mode 100644
index 8cf4eaa2e51929..00000000000000
--- a/lldb/test/API/lang/cpp/std-function-recognizer/main.cpp
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <functional>
-
-int foo(int x, int y) {
-  return x * y; // break here
-}
-
-int main(int argc, char *argv[]) {
-  std::function<int(int, int)> fn = foo;
-  return fn(argc, 1);
-}


        


More information about the lldb-commits mailing list