blob: 19b0e88b89637ff9f1a088575046a5a44a2db773 [file] [log] [blame]
Tamas Berghammerd161b212016-10-21 15:02:44 +00001//===-- LibStdcppUniquePointer.cpp ------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "LibStdcpp.h"
11
Tamas Berghammerd161b212016-10-21 15:02:44 +000012#include "lldb/Core/ValueObject.h"
13#include "lldb/DataFormatters/FormattersHelpers.h"
14#include "lldb/DataFormatters/TypeSynthetic.h"
Zachary Turnerbf9a7732017-02-02 21:39:50 +000015#include "lldb/Utility/ConstString.h"
Tamas Berghammerd161b212016-10-21 15:02:44 +000016
Tamas Berghammerde2cc6e2016-10-21 15:05:03 +000017#include <memory>
18#include <vector>
19
Tamas Berghammerd161b212016-10-21 15:02:44 +000020using namespace lldb;
21using namespace lldb_private;
22using namespace lldb_private::formatters;
23
24namespace {
25
26class LibStdcppUniquePtrSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
27public:
28 explicit LibStdcppUniquePtrSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp);
29
30 size_t CalculateNumChildren() override;
31
32 lldb::ValueObjectSP GetChildAtIndex(size_t idx) override;
33
34 bool Update() override;
35
36 bool MightHaveChildren() override;
37
38 size_t GetIndexOfChildWithName(const ConstString &name) override;
39
40 bool GetSummary(Stream &stream, const TypeSummaryOptions &options);
41
42private:
43 ValueObjectSP m_ptr_obj;
44 ValueObjectSP m_obj_obj;
45 ValueObjectSP m_del_obj;
Pavel Labathb312b132018-03-08 16:03:09 +000046
47 ValueObjectSP GetTuple();
Tamas Berghammerd161b212016-10-21 15:02:44 +000048};
49
50} // end of anonymous namespace
51
52LibStdcppUniquePtrSyntheticFrontEnd::LibStdcppUniquePtrSyntheticFrontEnd(
53 lldb::ValueObjectSP valobj_sp)
54 : SyntheticChildrenFrontEnd(*valobj_sp) {
55 Update();
56}
57
Pavel Labathb312b132018-03-08 16:03:09 +000058ValueObjectSP LibStdcppUniquePtrSyntheticFrontEnd::GetTuple() {
Tamas Berghammerd161b212016-10-21 15:02:44 +000059 ValueObjectSP valobj_backend_sp = m_backend.GetSP();
Pavel Labathb312b132018-03-08 16:03:09 +000060
Tamas Berghammerd161b212016-10-21 15:02:44 +000061 if (!valobj_backend_sp)
Pavel Labathb312b132018-03-08 16:03:09 +000062 return nullptr;
Tamas Berghammerd161b212016-10-21 15:02:44 +000063
64 ValueObjectSP valobj_sp = valobj_backend_sp->GetNonSyntheticValue();
65 if (!valobj_sp)
Pavel Labathb312b132018-03-08 16:03:09 +000066 return nullptr;
Tamas Berghammerd161b212016-10-21 15:02:44 +000067
Pavel Labathb312b132018-03-08 16:03:09 +000068 ValueObjectSP obj_child_sp =
Tamas Berghammerd161b212016-10-21 15:02:44 +000069 valobj_sp->GetChildMemberWithName(ConstString("_M_t"), true);
Pavel Labathb312b132018-03-08 16:03:09 +000070
71 ValueObjectSP obj_subchild_sp =
72 obj_child_sp->GetChildMemberWithName(ConstString("_M_t"), true);
73
74 // if there is a _M_t subchild, the tuple is found in
75 // the obj_subchild_sp (for libstdc++ 6.0.23).
76 if (obj_subchild_sp) {
77 return obj_subchild_sp;
78 }
79
80 return obj_child_sp;
81}
82
83bool LibStdcppUniquePtrSyntheticFrontEnd::Update() {
84 ValueObjectSP tuple_sp = GetTuple();
85
Tamas Berghammerd161b212016-10-21 15:02:44 +000086 if (!tuple_sp)
87 return false;
88
89 std::unique_ptr<SyntheticChildrenFrontEnd> tuple_frontend(
90 LibStdcppTupleSyntheticFrontEndCreator(nullptr, tuple_sp));
91
Tamas Berghammer4fbb55b2017-03-31 20:48:00 +000092 ValueObjectSP ptr_obj = tuple_frontend->GetChildAtIndex(0);
93 if (ptr_obj)
94 m_ptr_obj = ptr_obj->Clone(ConstString("pointer"));
Tamas Berghammerd161b212016-10-21 15:02:44 +000095
Tamas Berghammer4fbb55b2017-03-31 20:48:00 +000096 ValueObjectSP del_obj = tuple_frontend->GetChildAtIndex(1);
97 if (del_obj)
98 m_del_obj = del_obj->Clone(ConstString("deleter"));
Tamas Berghammerd161b212016-10-21 15:02:44 +000099
100 if (m_ptr_obj) {
Zachary Turner97206d52017-05-12 04:51:55 +0000101 Status error;
Tamas Berghammer4fbb55b2017-03-31 20:48:00 +0000102 ValueObjectSP obj_obj = m_ptr_obj->Dereference(error);
Tamas Berghammerd161b212016-10-21 15:02:44 +0000103 if (error.Success()) {
Tamas Berghammer4fbb55b2017-03-31 20:48:00 +0000104 m_obj_obj = obj_obj->Clone(ConstString("object"));
Tamas Berghammerd161b212016-10-21 15:02:44 +0000105 }
106 }
107
108 return false;
109}
110
111bool LibStdcppUniquePtrSyntheticFrontEnd::MightHaveChildren() { return true; }
112
113lldb::ValueObjectSP
114LibStdcppUniquePtrSyntheticFrontEnd::GetChildAtIndex(size_t idx) {
115 if (idx == 0)
Tamas Berghammeraf8953a2017-03-31 20:07:20 +0000116 return m_ptr_obj;
Tamas Berghammerd161b212016-10-21 15:02:44 +0000117 if (idx == 1)
118 return m_del_obj;
119 if (idx == 2)
Tamas Berghammeraf8953a2017-03-31 20:07:20 +0000120 return m_obj_obj;
Tamas Berghammerd161b212016-10-21 15:02:44 +0000121 return lldb::ValueObjectSP();
122}
123
124size_t LibStdcppUniquePtrSyntheticFrontEnd::CalculateNumChildren() {
125 if (m_del_obj)
126 return 2;
Tamas Berghammeraf8953a2017-03-31 20:07:20 +0000127 return 1;
Tamas Berghammerd161b212016-10-21 15:02:44 +0000128}
129
130size_t LibStdcppUniquePtrSyntheticFrontEnd::GetIndexOfChildWithName(
131 const ConstString &name) {
Tamas Berghammeraf8953a2017-03-31 20:07:20 +0000132 if (name == ConstString("ptr") || name == ConstString("pointer"))
Tamas Berghammerd161b212016-10-21 15:02:44 +0000133 return 0;
134 if (name == ConstString("del") || name == ConstString("deleter"))
135 return 1;
Tamas Berghammer4c08fe22017-03-31 20:23:22 +0000136 if (name == ConstString("obj") || name == ConstString("object") ||
137 name == ConstString("$$dereference$$"))
Tamas Berghammerd161b212016-10-21 15:02:44 +0000138 return 2;
139 return UINT32_MAX;
140}
141
142bool LibStdcppUniquePtrSyntheticFrontEnd::GetSummary(
143 Stream &stream, const TypeSummaryOptions &options) {
144 if (!m_ptr_obj)
145 return false;
146
Pavel Labath833e3d12016-11-09 10:42:29 +0000147 bool success;
148 uint64_t ptr_value = m_ptr_obj->GetValueAsUnsigned(0, &success);
149 if (!success)
150 return false;
151 if (ptr_value == 0)
Tamas Berghammerd161b212016-10-21 15:02:44 +0000152 stream.Printf("nullptr");
Pavel Labath833e3d12016-11-09 10:42:29 +0000153 else
154 stream.Printf("0x%" PRIx64, ptr_value);
Tamas Berghammerd161b212016-10-21 15:02:44 +0000155 return true;
156}
157
158SyntheticChildrenFrontEnd *
159lldb_private::formatters::LibStdcppUniquePtrSyntheticFrontEndCreator(
160 CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp) {
161 return (valobj_sp ? new LibStdcppUniquePtrSyntheticFrontEnd(valobj_sp)
162 : nullptr);
163}
164
165bool lldb_private::formatters::LibStdcppUniquePointerSummaryProvider(
166 ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) {
167 LibStdcppUniquePtrSyntheticFrontEnd formatter(valobj.GetSP());
168 return formatter.GetSummary(stream, options);
169}