LLDB  mainline
CoreMedia.cpp
Go to the documentation of this file.
1 //===-- CoreMedia.cpp --------------------------------------------*- C++
2 //-*-===//
3 //
4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5 // See https://llvm.org/LICENSE.txt for license information.
6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "CoreMedia.h"
11 
12 #include "lldb/Utility/Flags.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 
23  ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) {
24  CompilerType type = valobj.GetCompilerType();
25  if (!type.IsValid())
26  return false;
27 
28  TypeSystem *type_system =
29  valobj.GetExecutionContextRef()
30  .GetTargetSP()
31  ->GetScratchTypeSystemForLanguage(nullptr, lldb::eLanguageTypeC);
32  if (!type_system)
33  return false;
34 
35  // fetch children by offset to compensate for potential lack of debug info
36  auto int64_ty =
38  auto int32_ty =
40 
41  auto value_sp(valobj.GetSyntheticChildAtOffset(0, int64_ty, true));
42  auto timescale_sp(valobj.GetSyntheticChildAtOffset(8, int32_ty, true));
43  auto flags_sp(valobj.GetSyntheticChildAtOffset(12, int32_ty, true));
44 
45  if (!value_sp || !timescale_sp || !flags_sp)
46  return false;
47 
48  auto value = value_sp->GetValueAsUnsigned(0);
49  auto timescale = (int32_t)timescale_sp->GetValueAsUnsigned(
50  0); // the timescale specifies the fraction of a second each unit in the
51  // numerator occupies
52  auto flags = Flags(flags_sp->GetValueAsUnsigned(0) &
53  0x00000000000000FF); // the flags I need sit in the LSB
54 
55  const unsigned int FlagPositiveInf = 4;
56  const unsigned int FlagNegativeInf = 8;
57  const unsigned int FlagIndefinite = 16;
58 
59  if (flags.AnySet(FlagIndefinite)) {
60  stream.Printf("indefinite");
61  return true;
62  }
63 
64  if (flags.AnySet(FlagPositiveInf)) {
65  stream.Printf("+oo");
66  return true;
67  }
68 
69  if (flags.AnySet(FlagNegativeInf)) {
70  stream.Printf("-oo");
71  return true;
72  }
73 
74  if (timescale == 0)
75  return false;
76 
77  switch (timescale) {
78  case 0:
79  return false;
80  case 1:
81  stream.Printf("%" PRId64 " seconds", value);
82  return true;
83  case 2:
84  stream.Printf("%" PRId64 " half seconds", value);
85  return true;
86  case 3:
87  stream.Printf("%" PRId64 " third%sof a second", value,
88  value == 1 ? " " : "s ");
89  return true;
90  default:
91  stream.Printf("%" PRId64 " %" PRId32 "th%sof a second", value, timescale,
92  value == 1 ? " " : "s ");
93  return true;
94  }
95 }
CompilerType GetCompilerType()
Enumerations for broadcasting.
Definition: SBLaunchInfo.h:14
A stream class that can stream formatted output to a file.
Definition: Stream.h:28
virtual lldb::ValueObjectSP GetSyntheticChildAtOffset(uint32_t offset, const CompilerType &type, bool can_create, ConstString name_const_str=ConstString())
const ExecutionContextRef & GetExecutionContextRef() const
Definition: ValueObject.h:353
size_t Printf(const char *format,...) __attribute__((format(printf
Output printf formatted output to the stream.
Definition: Stream.cpp:106
virtual CompilerType GetBuiltinTypeForEncodingAndBitSize(lldb::Encoding encoding, size_t bit_size)=0
lldb::TargetSP GetTargetSP() const
Get accessor that creates a strong reference from the weak target reference contained in this object...
A class to manage flags.
Definition: Flags.h:22
Non-standardized C, such as K&R.
Definition: SBAddress.h:15
bool CMTimeSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition: CoreMedia.cpp:22