LLDB mainline
lldb_private::FormatterBytecode Namespace Reference

Classes

struct  DataStack
class  Dictionary

Typedefs

using ControlStackElement = llvm::StringRef
using ControlStack = std::vector<ControlStackElement>
using DictionarySP = std::shared_ptr<Dictionary>
using DataStackElement
template<typename T>
using EnableIfSigned
template<typename T>
using EnableIfUnsigned

Enumerations

enum  DataType : uint8_t {
  Any , String , Int , UInt ,
  Object , Type , Selector , Integer ,
  Dict
}
enum  OpCodes : uint8_t
enum  Selectors : uint8_t
enum  Signatures : uint8_t

Functions

llvm::Error Interpret (ControlStack &control, DataStack &data, Signatures sig, uint32_t version)
 Interpret the bytecode on control.
static llvm::Expected< std::string > SanitizeFormatString (llvm::StringRef fmt)
 Check a format string, and remove the layout and options of each replacement.
static llvm::Error FormatImpl (DataStack &data, uint32_t version)
 Implement the @format function.
static llvm::Error TypeCheck (llvm::ArrayRef< DataStackElement > data, DataType type)
static llvm::Error TypeCheck (llvm::ArrayRef< DataStackElement > data, DataType type1, DataType type2)
static llvm::Error TypeCheck (llvm::ArrayRef< DataStackElement > data, DataType type1, DataType type2, DataType type3)
static llvm::Error TypeCheck (llvm::ArrayRef< DataStackElement > data, DataType type1, DataType type2, DataType type3, DataType type4)
template<typename T>
static DataStackElement WrapAPSIntResult (T result, unsigned bit_width, bool is_unsigned)
 Wrap the result of a binary operator applied to two APSInts back into a DataStackElement.
static bool Reaches (const Dictionary *from, const Dictionary *target)
 Returns true if target is transitively reachable via from.
template<typename T, EnableIfSigned< T > = 0>
static DataStackElement MakeInt (T value, uint32_t version)
template<typename T, EnableIfUnsigned< T > = 0>
static DataStackElement MakeInt (T value, uint32_t version)

Typedef Documentation

◆ ControlStack

◆ ControlStackElement

Definition at line 54 of file FormatterBytecode.h.

◆ DataStackElement

Initial value:
std::variant<std::string, uint64_t, int64_t, lldb::ValueObjectSP,
Generic representation of a type in a programming language.
std::shared_ptr< Dictionary > DictionarySP
std::shared_ptr< lldb_private::ValueObject > ValueObjectSP

Definition at line 68 of file FormatterBytecode.h.

◆ DictionarySP

Definition at line 64 of file FormatterBytecode.h.

◆ EnableIfSigned

Initial value:
std::enable_if_t<std::is_integral_v<T> && std::is_signed_v<T>, int>

Definition at line 309 of file FormatterBytecode.cpp.

◆ EnableIfUnsigned

Initial value:
std::enable_if_t<std::is_integral_v<T> && std::is_unsigned_v<T> &&
!std::is_same_v<T, bool>,
int>

Definition at line 312 of file FormatterBytecode.cpp.

Enumeration Type Documentation

◆ DataType

Enumerator
Any 
String 
Int 

Deprecated: use Integer.

UInt 

Deprecated: use Integer.

Object 
Type 
Selector 
Integer 
Dict 

Definition at line 22 of file FormatterBytecode.h.

◆ OpCodes

Definition at line 36 of file FormatterBytecode.h.

◆ Selectors

Definition at line 42 of file FormatterBytecode.h.

◆ Signatures

Definition at line 48 of file FormatterBytecode.h.

Function Documentation

◆ FormatImpl()

llvm::Error lldb_private::FormatterBytecode::FormatImpl ( DataStack & data,
uint32_t version )
static

◆ Interpret()

◆ MakeInt() [1/2]

template<typename T, EnableIfSigned< T > = 0>
DataStackElement lldb_private::FormatterBytecode::MakeInt ( T value,
uint32_t version )
static

Definition at line 318 of file FormatterBytecode.cpp.

Referenced by Interpret().

◆ MakeInt() [2/2]

template<typename T, EnableIfUnsigned< T > = 0>
DataStackElement lldb_private::FormatterBytecode::MakeInt ( T value,
uint32_t version )
static

Definition at line 325 of file FormatterBytecode.cpp.

◆ Reaches()

bool lldb_private::FormatterBytecode::Reaches ( const Dictionary * from,
const Dictionary * target )
static

Returns true if target is transitively reachable via from.

Likewise, returns true if they are the same dictionary. This is used to prevent memory leaks caused by retain cycles. Dictionaries can be shared by multiple parents, so each one is visited only once to prevent exponential running time.

Definition at line 292 of file FormatterBytecode.cpp.

Referenced by Interpret().

◆ SanitizeFormatString()

llvm::Expected< std::string > lldb_private::FormatterBytecode::SanitizeFormatString ( llvm::StringRef fmt)
static

Check a format string, and remove the layout and options of each replacement.

The format string may contain literal text, escaped braces ("{{"), and automatically indexed replacements:

"{" [ "," layout ] [ ":" options ] "}"

Explicit indexes are not supported. Layouts and options are accepted, so that support for them can be added without changing the ABI, but they are currently ignored. The result contains only literal text, escaped braces, and "{}", so malformed format strings never reach formatv.

Definition at line 110 of file FormatterBytecode.cpp.

References lldb_private::DataFormatters, lldb_private::GetLog(), and LLDB_LOG.

Referenced by FormatImpl().

◆ TypeCheck() [1/4]

llvm::Error lldb_private::FormatterBytecode::TypeCheck ( llvm::ArrayRef< DataStackElement > data,
DataType type )
static

Definition at line 206 of file FormatterBytecode.cpp.

References Any, Dict, Int, Integer, Object, Selector, String, Type, and UInt.

Referenced by TypeCheck(), TypeCheck(), and TypeCheck().

◆ TypeCheck() [2/4]

llvm::Error lldb_private::FormatterBytecode::TypeCheck ( llvm::ArrayRef< DataStackElement > data,
DataType type1,
DataType type2 )
static

Definition at line 252 of file FormatterBytecode.cpp.

References error(), and TypeCheck().

◆ TypeCheck() [3/4]

llvm::Error lldb_private::FormatterBytecode::TypeCheck ( llvm::ArrayRef< DataStackElement > data,
DataType type1,
DataType type2,
DataType type3 )
static

Definition at line 259 of file FormatterBytecode.cpp.

References error(), and TypeCheck().

◆ TypeCheck() [4/4]

llvm::Error lldb_private::FormatterBytecode::TypeCheck ( llvm::ArrayRef< DataStackElement > data,
DataType type1,
DataType type2,
DataType type3,
DataType type4 )
static

Definition at line 266 of file FormatterBytecode.cpp.

References error(), and TypeCheck().

◆ WrapAPSIntResult()

template<typename T>
DataStackElement lldb_private::FormatterBytecode::WrapAPSIntResult ( T result,
unsigned bit_width,
bool is_unsigned )
static

Wrap the result of a binary operator applied to two APSInts back into a DataStackElement.

Comparison operators yield bool and need bit_width/ is_unsigned to construct the boolean's APSInt representation; arithmetic operators already yield a correctly-tagged APSInt and ignore them.

Definition at line 279 of file FormatterBytecode.cpp.