• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===-- CoreMedia.cpp -----------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "CoreMedia.h"
10 
11 #include "lldb/Utility/Flags.h"
12 #include "lldb/Utility/Log.h"
13 
14 #include "lldb/Symbol/TypeSystem.h"
15 #include "lldb/Target/Target.h"
16 #include <inttypes.h>
17 
18 using namespace lldb;
19 using namespace lldb_private;
20 using namespace lldb_private::formatters;
21 
CMTimeSummaryProvider(ValueObject & valobj,Stream & stream,const TypeSummaryOptions & options)22 bool lldb_private::formatters::CMTimeSummaryProvider(
23     ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) {
24   CompilerType type = valobj.GetCompilerType();
25   if (!type.IsValid())
26     return false;
27 
28   auto type_system_or_err =
29       valobj.GetExecutionContextRef()
30           .GetTargetSP()
31           ->GetScratchTypeSystemForLanguage(lldb::eLanguageTypeC);
32   if (auto err = type_system_or_err.takeError()) {
33     LLDB_LOG_ERROR(
34         lldb_private::GetLogIfAnyCategoriesSet(LIBLLDB_LOG_DATAFORMATTERS),
35         std::move(err), "Failed to get scratch type system");
36     return false;
37   }
38   // fetch children by offset to compensate for potential lack of debug info
39   auto int64_ty = type_system_or_err->GetBuiltinTypeForEncodingAndBitSize(
40       eEncodingSint, 64);
41   auto int32_ty = type_system_or_err->GetBuiltinTypeForEncodingAndBitSize(
42       eEncodingSint, 32);
43 
44   auto value_sp(valobj.GetSyntheticChildAtOffset(0, int64_ty, true));
45   auto timescale_sp(valobj.GetSyntheticChildAtOffset(8, int32_ty, true));
46   auto flags_sp(valobj.GetSyntheticChildAtOffset(12, int32_ty, true));
47 
48   if (!value_sp || !timescale_sp || !flags_sp)
49     return false;
50 
51   auto value = value_sp->GetValueAsUnsigned(0);
52   auto timescale = (int32_t)timescale_sp->GetValueAsUnsigned(
53       0); // the timescale specifies the fraction of a second each unit in the
54           // numerator occupies
55   auto flags = Flags(flags_sp->GetValueAsUnsigned(0) &
56                      0x00000000000000FF); // the flags I need sit in the LSB
57 
58   const unsigned int FlagPositiveInf = 4;
59   const unsigned int FlagNegativeInf = 8;
60   const unsigned int FlagIndefinite = 16;
61 
62   if (flags.AnySet(FlagIndefinite)) {
63     stream.Printf("indefinite");
64     return true;
65   }
66 
67   if (flags.AnySet(FlagPositiveInf)) {
68     stream.Printf("+oo");
69     return true;
70   }
71 
72   if (flags.AnySet(FlagNegativeInf)) {
73     stream.Printf("-oo");
74     return true;
75   }
76 
77   if (timescale == 0)
78     return false;
79 
80   switch (timescale) {
81   case 0:
82     return false;
83   case 1:
84     stream.Printf("%" PRId64 " seconds", value);
85     return true;
86   case 2:
87     stream.Printf("%" PRId64 " half seconds", value);
88     return true;
89   case 3:
90     stream.Printf("%" PRId64 " third%sof a second", value,
91                   value == 1 ? " " : "s ");
92     return true;
93   default:
94     stream.Printf("%" PRId64 " %" PRId32 "th%sof a second", value, timescale,
95                   value == 1 ? " " : "s ");
96     return true;
97   }
98 }
99