//===-- 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/Utility/Flags.h" #include "lldb/Symbol/TypeSystem.h" #include "lldb/Target/Target.h" #include 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() ->GetScratchTypeSystemForLanguage(nullptr, lldb::eLanguageTypeC); if (!type_system) return false; // fetch children by offset to compensate for potential lack of debug info auto int64_ty = type_system->GetBuiltinTypeForEncodingAndBitSize(eEncodingSint, 64); auto int32_ty = type_system->GetBuiltinTypeForEncodingAndBitSize(eEncodingSint, 32); 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; } }