//===-- CoreMedia.cpp -----------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "CoreMedia.h" #include "lldb/Utility/Flags.h" #include "lldb/Utility/Log.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; auto type_system_or_err = valobj.GetExecutionContextRef() .GetTargetSP() ->GetScratchTypeSystemForLanguage(lldb::eLanguageTypeC); if (auto err = type_system_or_err.takeError()) { LLDB_LOG_ERROR( lldb_private::GetLogIfAnyCategoriesSet(LIBLLDB_LOG_DATAFORMATTERS), std::move(err), "Failed to get scratch type system"); return false; } // fetch children by offset to compensate for potential lack of debug info auto int64_ty = type_system_or_err->GetBuiltinTypeForEncodingAndBitSize( eEncodingSint, 64); auto int32_ty = type_system_or_err->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; } }