Skip to content

Commit

Permalink
Add data formatter for libc++ std::queue
Browse files Browse the repository at this point in the history
Summary:
std::queue is just a fancy wrapper around another container, so all we
need to do is to delegate to the it.

Reviewers: jingham, EricWF

Subscribers: srhines, mgorny, lldb-commits, eugene

Differential Revision: https://reviews.llvm.org/D35666

llvm-svn: 317099
  • Loading branch information
labath committed Nov 1, 2017
1 parent 778810e commit e0d5184
Show file tree
Hide file tree
Showing 7 changed files with 134 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
LEVEL = ../../../../../make

CXX_SOURCES := main.cpp

USE_LIBCPP := 1
include $(LEVEL)/Makefile.rules
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
"""
Test lldb data formatter subsystem.
"""

from __future__ import print_function


import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil


class TestDataFormatterLibcxxQueue(TestBase):

mydir = TestBase.compute_mydir(__file__)

def setUp(self):
TestBase.setUp(self)
ns = 'ndk' if lldbplatformutil.target_is_android() else ''
self.namespace = 'std::__' + ns + '1'

def check_variable(self, name):
var = self.frame().FindVariable(name)
self.assertTrue(var.IsValid())

queue = self.namespace + '::queue'
self.assertTrue(queue in var.GetTypeName())
self.assertEqual(var.GetNumChildren(), 5)
for i in range(5):
ch = var.GetChildAtIndex(i)
self.assertTrue(ch.IsValid())
self.assertEqual(ch.GetValueAsSigned(), i+1)

@add_test_categories(["libc++"])
def test(self):
"""Test that std::queue is displayed correctly"""
self.build()
lldbutil.run_to_source_breakpoint(self, '// break here',
lldb.SBFileSpec("main.cpp", False))

self.check_variable('q1')
self.check_variable('q2')
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#include <queue>
#include <vector>

using namespace std;

int main() {
queue<int> q1{{1,2,3,4,5}};
queue<int, std::vector<int>> q2{{1,2,3,4,5}};
int ret = q1.size() + q2.size(); // break here
return ret;
}
1 change: 1 addition & 0 deletions lldb/source/Plugins/Language/CPlusPlus/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ add_lldb_library(lldbPluginCPlusPlusLanguage PLUGIN
LibCxxInitializerList.cpp
LibCxxList.cpp
LibCxxMap.cpp
LibCxxQueue.cpp
LibCxxTuple.cpp
LibCxxUnorderedMap.cpp
LibCxxVector.cpp
Expand Down
9 changes: 9 additions & 0 deletions lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -473,6 +473,10 @@ static void LoadLibCxxFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
"libc++ std::initializer_list synthetic children",
ConstString("^std::initializer_list<.+>(( )?&)?$"), stl_synth_flags,
true);
AddCXXSynthetic(cpp_category_sp, LibcxxQueueFrontEndCreator,
"libc++ std::queue synthetic children",
ConstString("^std::__(ndk)?1::queue<.+>(( )?&)?$"),
stl_synth_flags, true);
AddCXXSynthetic(cpp_category_sp, LibcxxTupleFrontEndCreator,
"libc++ std::tuple synthetic children",
ConstString("^std::__(ndk)?1::tuple<.*>(( )?&)?$"), stl_synth_flags,
Expand Down Expand Up @@ -530,6 +534,11 @@ static void LoadLibCxxFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
"libc++ std::deque summary provider",
ConstString("^std::__(ndk)?1::deque<.+>(( )?&)?$"),
stl_summary_flags, true);
AddCXXSummary(cpp_category_sp,
lldb_private::formatters::LibcxxContainerSummaryProvider,
"libc++ std::queue summary provider",
ConstString("^std::__(ndk)?1::queue<.+>(( )?&)?$"),
stl_summary_flags, true);
AddCXXSummary(cpp_category_sp,
lldb_private::formatters::LibcxxContainerSummaryProvider,
"libc++ std::set summary provider",
Expand Down
3 changes: 3 additions & 0 deletions lldb/source/Plugins/Language/CPlusPlus/LibCxx.h
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,9 @@ LibcxxInitializerListSyntheticFrontEndCreator(CXXSyntheticChildren *,
SyntheticChildrenFrontEnd *LibcxxFunctionFrontEndCreator(CXXSyntheticChildren *,
lldb::ValueObjectSP);

SyntheticChildrenFrontEnd *LibcxxQueueFrontEndCreator(CXXSyntheticChildren *,
lldb::ValueObjectSP);

SyntheticChildrenFrontEnd *LibcxxTupleFrontEndCreator(CXXSyntheticChildren *,
lldb::ValueObjectSP);

Expand Down
61 changes: 61 additions & 0 deletions lldb/source/Plugins/Language/CPlusPlus/LibCxxQueue.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
//===-- LibCxxQueue.cpp -----------------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#include "LibCxx.h"
#include "lldb/DataFormatters/FormattersHelpers.h"

using namespace lldb;
using namespace lldb_private;

namespace {

class QueueFrontEnd : public SyntheticChildrenFrontEnd {
public:
QueueFrontEnd(ValueObject &valobj) : SyntheticChildrenFrontEnd(valobj) {
Update();
}

size_t GetIndexOfChildWithName(const ConstString &name) override {
return m_container_sp ? m_container_sp->GetIndexOfChildWithName(name)
: UINT32_MAX;
}

bool MightHaveChildren() override { return true; }
bool Update() override;

size_t CalculateNumChildren() override {
return m_container_sp ? m_container_sp->GetNumChildren() : 0;
}

ValueObjectSP GetChildAtIndex(size_t idx) override {
return m_container_sp ? m_container_sp->GetChildAtIndex(idx, true)
: nullptr;
}

private:
ValueObjectSP m_container_sp;
};
} // namespace

bool QueueFrontEnd::Update() {
m_container_sp.reset();
ValueObjectSP c_sp = m_backend.GetChildMemberWithName(ConstString("c"), true);
if (!c_sp)
return false;
m_container_sp = c_sp->GetSyntheticValue();
return false;
}

SyntheticChildrenFrontEnd *
formatters::LibcxxQueueFrontEndCreator(CXXSyntheticChildren *,
lldb::ValueObjectSP valobj_sp) {
if (valobj_sp)
return new QueueFrontEnd(*valobj_sp);
return nullptr;
}

0 comments on commit e0d5184

Please sign in to comment.