180814287SRaphael Isemann //===-- CoreMedia.cpp -----------------------------------------------------===//
2170c395eSEnrico Granata //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6170c395eSEnrico Granata //
7170c395eSEnrico Granata //===----------------------------------------------------------------------===//
8170c395eSEnrico Granata 
9170c395eSEnrico Granata #include "CoreMedia.h"
10170c395eSEnrico Granata 
1101c3243fSZachary Turner #include "lldb/Utility/Flags.h"
120e252e38SAlex Langford #include "lldb/Utility/Log.h"
1301c3243fSZachary Turner 
14170c395eSEnrico Granata #include "lldb/Symbol/TypeSystem.h"
15170c395eSEnrico Granata #include "lldb/Target/Target.h"
16*76e47d48SRaphael Isemann #include <cinttypes>
17170c395eSEnrico Granata 
18170c395eSEnrico Granata using namespace lldb;
19170c395eSEnrico Granata using namespace lldb_private;
20170c395eSEnrico Granata using namespace lldb_private::formatters;
21170c395eSEnrico Granata 
CMTimeSummaryProvider(ValueObject & valobj,Stream & stream,const TypeSummaryOptions & options)22b9c1b51eSKate Stone bool lldb_private::formatters::CMTimeSummaryProvider(
23b9c1b51eSKate Stone     ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) {
24170c395eSEnrico Granata   CompilerType type = valobj.GetCompilerType();
25170c395eSEnrico Granata   if (!type.IsValid())
26170c395eSEnrico Granata     return false;
27170c395eSEnrico Granata 
28839e8452SRaphael Isemann   TypeSystem *type_system = type.GetTypeSystem();
29170c395eSEnrico Granata   // fetch children by offset to compensate for potential lack of debug info
30839e8452SRaphael Isemann   auto int64_ty =
31839e8452SRaphael Isemann       type_system->GetBuiltinTypeForEncodingAndBitSize(eEncodingSint, 64);
32839e8452SRaphael Isemann   auto int32_ty =
33839e8452SRaphael Isemann       type_system->GetBuiltinTypeForEncodingAndBitSize(eEncodingSint, 32);
34170c395eSEnrico Granata 
35170c395eSEnrico Granata   auto value_sp(valobj.GetSyntheticChildAtOffset(0, int64_ty, true));
36170c395eSEnrico Granata   auto timescale_sp(valobj.GetSyntheticChildAtOffset(8, int32_ty, true));
37170c395eSEnrico Granata   auto flags_sp(valobj.GetSyntheticChildAtOffset(12, int32_ty, true));
38170c395eSEnrico Granata 
39170c395eSEnrico Granata   if (!value_sp || !timescale_sp || !flags_sp)
40170c395eSEnrico Granata     return false;
41170c395eSEnrico Granata 
42170c395eSEnrico Granata   auto value = value_sp->GetValueAsUnsigned(0);
43b9c1b51eSKate Stone   auto timescale = (int32_t)timescale_sp->GetValueAsUnsigned(
44b9c1b51eSKate Stone       0); // the timescale specifies the fraction of a second each unit in the
45b9c1b51eSKate Stone           // numerator occupies
46b9c1b51eSKate Stone   auto flags = Flags(flags_sp->GetValueAsUnsigned(0) &
47b9c1b51eSKate Stone                      0x00000000000000FF); // the flags I need sit in the LSB
48170c395eSEnrico Granata 
49170c395eSEnrico Granata   const unsigned int FlagPositiveInf = 4;
50170c395eSEnrico Granata   const unsigned int FlagNegativeInf = 8;
51170c395eSEnrico Granata   const unsigned int FlagIndefinite = 16;
52170c395eSEnrico Granata 
53b9c1b51eSKate Stone   if (flags.AnySet(FlagIndefinite)) {
54170c395eSEnrico Granata     stream.Printf("indefinite");
55170c395eSEnrico Granata     return true;
56170c395eSEnrico Granata   }
57170c395eSEnrico Granata 
58b9c1b51eSKate Stone   if (flags.AnySet(FlagPositiveInf)) {
59170c395eSEnrico Granata     stream.Printf("+oo");
60170c395eSEnrico Granata     return true;
61170c395eSEnrico Granata   }
62170c395eSEnrico Granata 
63b9c1b51eSKate Stone   if (flags.AnySet(FlagNegativeInf)) {
64170c395eSEnrico Granata     stream.Printf("-oo");
65170c395eSEnrico Granata     return true;
66170c395eSEnrico Granata   }
67170c395eSEnrico Granata 
68170c395eSEnrico Granata   if (timescale == 0)
69170c395eSEnrico Granata     return false;
70170c395eSEnrico Granata 
71b9c1b51eSKate Stone   switch (timescale) {
72170c395eSEnrico Granata   case 0:
73170c395eSEnrico Granata     return false;
74170c395eSEnrico Granata   case 1:
75170c395eSEnrico Granata     stream.Printf("%" PRId64 " seconds", value);
76170c395eSEnrico Granata     return true;
77170c395eSEnrico Granata   case 2:
78170c395eSEnrico Granata     stream.Printf("%" PRId64 " half seconds", value);
79170c395eSEnrico Granata     return true;
80170c395eSEnrico Granata   case 3:
81b9c1b51eSKate Stone     stream.Printf("%" PRId64 " third%sof a second", value,
82b9c1b51eSKate Stone                   value == 1 ? " " : "s ");
83170c395eSEnrico Granata     return true;
84170c395eSEnrico Granata   default:
85b9c1b51eSKate Stone     stream.Printf("%" PRId64 " %" PRId32 "th%sof a second", value, timescale,
86b9c1b51eSKate Stone                   value == 1 ? " " : "s ");
87170c395eSEnrico Granata     return true;
88170c395eSEnrico Granata   }
89170c395eSEnrico Granata }
90