xref: /llvm-project/lldb/test/API/functionalities/data-formatter/bytecode-summary/main.cpp (revision 87659a17d0703c1244211d9f8d1f0c21e816f0e1)
1*87659a17SAdrian Prantl // A bare-bones llvm::Optional reimplementation.
2*87659a17SAdrian Prantl 
3*87659a17SAdrian Prantl template <typename T> struct MyOptionalStorage {
4*87659a17SAdrian Prantl   MyOptionalStorage(T val) : value(val), hasVal(true) {}
5*87659a17SAdrian Prantl   MyOptionalStorage() {}
6*87659a17SAdrian Prantl   T value;
7*87659a17SAdrian Prantl   bool hasVal = false;
8*87659a17SAdrian Prantl };
9*87659a17SAdrian Prantl 
10*87659a17SAdrian Prantl template <typename T> struct MyOptional {
11*87659a17SAdrian Prantl   MyOptionalStorage<T> Storage;
12*87659a17SAdrian Prantl   MyOptional(T val) : Storage(val) {}
13*87659a17SAdrian Prantl   MyOptional() {}
14*87659a17SAdrian Prantl   T &operator*() { return Storage.value; }
15*87659a17SAdrian Prantl };
16*87659a17SAdrian Prantl 
17*87659a17SAdrian Prantl void stop() {}
18*87659a17SAdrian Prantl 
19*87659a17SAdrian Prantl int main(int argc, char **argv) {
20*87659a17SAdrian Prantl   MyOptional<int> x, y = 42;
21*87659a17SAdrian Prantl   stop(); // break here
22*87659a17SAdrian Prantl   return *y;
23*87659a17SAdrian Prantl }
24*87659a17SAdrian Prantl 
25*87659a17SAdrian Prantl // Produced from the assembler in
26*87659a17SAdrian Prantl // Shell/ScriptInterpreter/Python/Inputs/FormatterBytecode/formatter.py
27*87659a17SAdrian Prantl __attribute__((used, section("__DATA_CONST,__lldbformatters"))) unsigned char
28*87659a17SAdrian Prantl     _MyOptional_type_summary[] =
29*87659a17SAdrian Prantl         "\x01"             // version
30*87659a17SAdrian Prantl         "\xa4"             // record size
31*87659a17SAdrian Prantl         "\x01"             // record size
32*87659a17SAdrian Prantl         "\x10"             // type name size
33*87659a17SAdrian Prantl         "^MyOptional<.+>$" // type name
34*87659a17SAdrian Prantl         "\x00"             // flags
35*87659a17SAdrian Prantl         "\x00"             // sig_summary
36*87659a17SAdrian Prantl         "\x8d"             // program size
37*87659a17SAdrian Prantl         "\x01"             // program size
38*87659a17SAdrian Prantl         "\x1\x22\x7Storage#\x12\x60\x1,C\x10\x1\x5\x11\x2\x1\x22\x6hasVal#"
39*87659a17SAdrian Prantl         "\x12\x60\x1,\x10\x1e\x2\x22\x1b<could not read MyOptional>\x10G#!\x60 "
40*87659a17SAdrian Prantl         "\x0P\x10\x6\x22\x4None\x10\x36\x1#\x15\x60 "
41*87659a17SAdrian Prantl         "\x0#\x16\x60\x5\x22\x5value#\x12\x60\x5#\x17\x60\x1,"
42*87659a17SAdrian Prantl         "\x10\x6\x22\x4None\x10\x11\x1#\x0\x60\x1#R\x60\x10\x3# "
43*87659a17SAdrian Prantl         "\x60\x10\x1\x2\x12\x12\x12\x12"; // summary function
44