summaryrefslogtreecommitdiffstats
path: root/lldb/source/Plugins/Language/ObjC/CoreMedia.cpp
diff options
context:
space:
mode:
authorEnrico Granata <egranata@apple.com>2015-09-14 22:18:32 +0000
committerEnrico Granata <egranata@apple.com>2015-09-14 22:18:32 +0000
commit170c395e7004732b10d6ff7762f420fff1cfc40c (patch)
treeedbd5058b53536aa820376cc96b534e58629962a /lldb/source/Plugins/Language/ObjC/CoreMedia.cpp
parentdeef90d7f5d35f1d07d0df821111725852b3c432 (diff)
downloadbcm5719-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.cpp89
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;
+ }
+}
OpenPOWER on IntegriCloud