diff options
author | Enrico Granata <egranata@apple.com> | 2015-09-14 22:18:32 +0000 |
---|---|---|
committer | Enrico Granata <egranata@apple.com> | 2015-09-14 22:18:32 +0000 |
commit | 170c395e7004732b10d6ff7762f420fff1cfc40c (patch) | |
tree | edbd5058b53536aa820376cc96b534e58629962a /lldb/source/Plugins/Language/ObjC/CoreMedia.cpp | |
parent | deef90d7f5d35f1d07d0df821111725852b3c432 (diff) | |
download | bcm5719-llvm-170c395e7004732b10d6ff7762f420fff1cfc40c.tar.gz bcm5719-llvm-170c395e7004732b10d6ff7762f420fff1cfc40c.zip |
Move Objective-C data formatters to the Objective-C language plugin where they belong
llvm-svn: 247627
Diffstat (limited to 'lldb/source/Plugins/Language/ObjC/CoreMedia.cpp')
-rw-r--r-- | lldb/source/Plugins/Language/ObjC/CoreMedia.cpp | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/lldb/source/Plugins/Language/ObjC/CoreMedia.cpp b/lldb/source/Plugins/Language/ObjC/CoreMedia.cpp new file mode 100644 index 00000000000..bc7a93314c4 --- /dev/null +++ b/lldb/source/Plugins/Language/ObjC/CoreMedia.cpp @@ -0,0 +1,89 @@ +//===-- CoreMedia.cpp --------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "CoreMedia.h" + +#include "lldb/Core/Flags.h" +#include "lldb/Symbol/TypeSystem.h" +#include "lldb/Target/Target.h" +#include <inttypes.h> + +using namespace lldb; +using namespace lldb_private; +using namespace lldb_private::formatters; + +bool +lldb_private::formatters::CMTimeSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) +{ + CompilerType type = valobj.GetCompilerType(); + if (!type.IsValid()) + return false; + + TypeSystem *type_system = valobj.GetExecutionContextRef().GetTargetSP()->GetTypeSystemForLanguage(lldb::eLanguageTypeC); + if (!type_system) + return false; + + // fetch children by offset to compensate for potential lack of debug info + auto int64_ty = type_system->GetIntTypeFromBitSize(64, true); + auto int32_ty = type_system->GetIntTypeFromBitSize(32, true); + + auto value_sp(valobj.GetSyntheticChildAtOffset(0, int64_ty, true)); + auto timescale_sp(valobj.GetSyntheticChildAtOffset(8, int32_ty, true)); + auto flags_sp(valobj.GetSyntheticChildAtOffset(12, int32_ty, true)); + + if (!value_sp || !timescale_sp || !flags_sp) + return false; + + auto value = value_sp->GetValueAsUnsigned(0); + auto timescale = (int32_t)timescale_sp->GetValueAsUnsigned(0); // the timescale specifies the fraction of a second each unit in the numerator occupies + auto flags = Flags(flags_sp->GetValueAsUnsigned(0) & 0x00000000000000FF); // the flags I need sit in the LSB + + const unsigned int FlagPositiveInf = 4; + const unsigned int FlagNegativeInf = 8; + const unsigned int FlagIndefinite = 16; + + if (flags.AnySet(FlagIndefinite)) + { + stream.Printf("indefinite"); + return true; + } + + if (flags.AnySet(FlagPositiveInf)) + { + stream.Printf("+oo"); + return true; + } + + if (flags.AnySet(FlagNegativeInf)) + { + stream.Printf("-oo"); + return true; + } + + if (timescale == 0) + return false; + + switch (timescale) + { + case 0: + return false; + case 1: + stream.Printf("%" PRId64 " seconds", value); + return true; + case 2: + stream.Printf("%" PRId64 " half seconds", value); + return true; + case 3: + stream.Printf("%" PRId64 " third%sof a second", value, value == 1 ? " " : "s "); + return true; + default: + stream.Printf("%" PRId64 " %" PRId32 "th%sof a second", value, timescale, value == 1 ? " " : "s "); + return true; + } +} |