This patch adds `get_priority()` support to synthetic frame providers to enable priority-based selection when multiple providers match a thread. This is the first step toward supporting frame provider chaining for visualizing coroutines, Swift async tasks, and et al. Priority ordering follows Unix nice convention where lower numbers indicate higher priority (0 = highest). Providers without explicit priority return `std::nullopt`, which maps to UINT32_MAX (lowest priority), ensuring backward compatibility with existing providers. The implementation adds `GetPriority()` as a virtual method to `SyntheticFrameProvider` base class, implements it through the scripting interface hierarchy (`ScriptedFrameProviderInterface` and `ScriptedFrameProviderPythonInterface`), and updates `Thread::GetStackFrameList()` to sort applicable providers by priority before attempting to load them. Python frame providers can now specify priority: ```python @staticmethod def get_priority(): return 10 # Or return None for default priority. ``` Signed-off-by: Med Ismail Bennani <ismail@bennani.ma>
56 lines
1.9 KiB
C++
56 lines
1.9 KiB
C++
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLDB_PLUGINS_SYNTHETICFRAMEPROVIDER_SCRIPTEDFRAMEPROVIDER_SCRIPTEDFRAMEPROVIDER_H
|
|
#define LLDB_PLUGINS_SYNTHETICFRAMEPROVIDER_SCRIPTEDFRAMEPROVIDER_SCRIPTEDFRAMEPROVIDER_H
|
|
|
|
#include "lldb/Target/SyntheticFrameProvider.h"
|
|
#include "lldb/Utility/ScriptedMetadata.h"
|
|
#include "lldb/Utility/Status.h"
|
|
#include "lldb/lldb-forward.h"
|
|
#include "llvm/Support/Error.h"
|
|
|
|
namespace lldb_private {
|
|
|
|
class ScriptedFrameProvider : public SyntheticFrameProvider {
|
|
public:
|
|
static llvm::StringRef GetPluginNameStatic() {
|
|
return "ScriptedFrameProvider";
|
|
}
|
|
|
|
static llvm::Expected<lldb::SyntheticFrameProviderSP>
|
|
CreateInstance(lldb::StackFrameListSP input_frames,
|
|
const ScriptedFrameProviderDescriptor &descriptor);
|
|
|
|
static void Initialize();
|
|
|
|
static void Terminate();
|
|
|
|
ScriptedFrameProvider(lldb::StackFrameListSP input_frames,
|
|
lldb::ScriptedFrameProviderInterfaceSP interface_sp,
|
|
const ScriptedFrameProviderDescriptor &descriptor);
|
|
~ScriptedFrameProvider() override;
|
|
|
|
llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); }
|
|
|
|
std::string GetDescription() const override;
|
|
|
|
std::optional<uint32_t> GetPriority() const override;
|
|
|
|
/// Get a single stack frame at the specified index.
|
|
llvm::Expected<lldb::StackFrameSP> GetFrameAtIndex(uint32_t idx) override;
|
|
|
|
private:
|
|
lldb::ScriptedFrameProviderInterfaceSP m_interface_sp;
|
|
const ScriptedFrameProviderDescriptor &m_descriptor;
|
|
};
|
|
|
|
} // namespace lldb_private
|
|
|
|
#endif // LLDB_PLUGINS_SYNTHETICFRAMEPROVIDER_SCRIPTEDFRAMEPROVIDER_SCRIPTEDFRAMEPROVIDER_H
|