blob: da52cd94d0df340ebacf2cf32e45ddb0d64cc066 [file] [log] [blame]
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef EXTENSIONS_CXX_DEBUGGING_WASM_MODULE_H_
#define EXTENSIONS_CXX_DEBUGGING_WASM_MODULE_H_
#include "lldb/lldb-enumerations.h"
#include "lldb/lldb-forward.h"
#include "lldb/lldb-types.h"
#include "llvm/ADT/SmallSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/Error.h"
#include <cstdint>
#include <memory>
#include <string>
#include <utility>
#include <vector>
namespace symbols_backend {
namespace api {
class DebuggerProxy;
}
class ObjectInfo;
struct SourceLocation {
SourceLocation(llvm::StringRef file, uint32_t line, uint16_t column)
: file(file), line(line), column(column) {}
std::string file;
uint32_t line;
uint16_t column;
friend bool operator==(const SourceLocation&, const SourceLocation&);
};
struct Variable {
Variable(llvm::StringRef name, lldb::ValueType scope, llvm::StringRef type)
: name(name), scope(scope), type(type) {}
std::string name;
lldb::ValueType scope;
std::string type;
friend bool operator==(const Variable&, const Variable&);
};
struct FunctionInfo {
FunctionInfo(llvm::SmallVector<std::string, 1> names,
llvm::SmallVector<std::string, 2> missing_symbols)
: names(names), missing_symbols(missing_symbols) {}
llvm::SmallVector<std::string, 1> names;
llvm::SmallVector<std::string, 2> missing_symbols;
};
struct SourceInfo {
SourceInfo(llvm::SmallSet<std::string, 1> sources,
llvm::SmallSet<std::string, 1> dwos)
: sources(sources), dwos(dwos) {}
llvm::SmallSet<std::string, 1> sources;
llvm::SmallSet<std::string, 1> dwos;
};
struct ExpressionResult;
class WasmModule {
lldb::ModuleSP module_;
lldb::TargetSP target_;
explicit WasmModule(lldb::TargetSP target, lldb::ModuleSP module)
: module_(module), target_(target) {}
public:
~WasmModule(){};
WasmModule(const WasmModule&) = delete;
WasmModule& operator=(const WasmModule&) = delete;
WasmModule(WasmModule&&) = default;
WasmModule& operator=(WasmModule&&) = default;
static llvm::Expected<std::unique_ptr<WasmModule>> CreateFromFile(
llvm::StringRef path);
bool Valid() const;
lldb_private::Module* Module() const { return module_.get(); }
lldb_private::Target* Target() const { return target_.get(); }
SourceInfo GetSourceScripts() const;
llvm::SmallSet<SourceLocation, 1> GetSourceLocationFromOffset(
lldb::addr_t offset,
int inline_frame_index) const;
llvm::SmallSet<std::pair<lldb::addr_t, lldb::addr_t>, 1>
GetOffsetFromSourceLocation(const SourceLocation& source_loc) const;
std::set<Variable> GetVariablesInScope(lldb::addr_t offset,
int inline_frame_index) const;
FunctionInfo GetFunctionInfo(lldb::addr_t offset) const;
// Returns inline function address ranges for the inline function containing
// offset, or an empty set if offset is not in an inline function. Used for
// stepping out of inline functions.
llvm::SmallSet<std::pair<lldb::addr_t, lldb::addr_t>, 1>
GetInlineFunctionAddressRanges(lldb::addr_t offset) const;
// Returns address ranges for any inline function calls made by the function
// or inline function containing offset. Used for stepping over inline
// functions.
llvm::SmallSet<std::pair<lldb::addr_t, lldb::addr_t>, 1>
GetChildInlineFunctionAddressRanges(lldb::addr_t offset) const;
std::vector<int32_t> GetMappedLines(llvm::StringRef file) const;
lldb::VariableSP FindVariableAtOffset(lldb::addr_t offset,
int inline_frame_index,
llvm::StringRef name) const;
llvm::Optional<lldb_private::CompilerType> FindType(
llvm::StringRef name) const;
llvm::Expected<ExpressionResult> InterpretExpression(
lldb::addr_t frame_offset,
uint32_t inline_frame_index,
llvm::StringRef expression,
const api::DebuggerProxy& proxy) const;
};
} // namespace symbols_backend
#endif // EXTENSIONS_CXX_DEBUGGING_WASM_MODULE_H_