/contrib/llvm/tools/lldb/source/DataFormatters/LanguageCategory.cpp

https://bitbucket.org/freebsd/freebsd-base
C++ | 227 lines | 182 code | 37 blank | 8 comment | 55 complexity | d6636eb3ae7ef95dded5f1a0c4f5edab MD5 | raw file
  1. //===-- LanguageCategory.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. #include "lldb/DataFormatters/LanguageCategory.h"
  10. #include "lldb/DataFormatters/FormatManager.h"
  11. #include "lldb/DataFormatters/TypeCategory.h"
  12. #include "lldb/DataFormatters/TypeFormat.h"
  13. #include "lldb/DataFormatters/TypeSummary.h"
  14. #include "lldb/DataFormatters/TypeSynthetic.h"
  15. #include "lldb/DataFormatters/TypeValidator.h"
  16. #include "lldb/Target/Language.h"
  17. using namespace lldb;
  18. using namespace lldb_private;
  19. LanguageCategory::LanguageCategory(lldb::LanguageType lang_type)
  20. : m_category_sp(), m_hardcoded_formats(), m_hardcoded_summaries(),
  21. m_hardcoded_synthetics(), m_hardcoded_validators(), m_format_cache(),
  22. m_enabled(false) {
  23. if (Language *language_plugin = Language::FindPlugin(lang_type)) {
  24. m_category_sp = language_plugin->GetFormatters();
  25. m_hardcoded_formats = language_plugin->GetHardcodedFormats();
  26. m_hardcoded_summaries = language_plugin->GetHardcodedSummaries();
  27. m_hardcoded_synthetics = language_plugin->GetHardcodedSynthetics();
  28. m_hardcoded_validators = language_plugin->GetHardcodedValidators();
  29. }
  30. Enable();
  31. }
  32. bool LanguageCategory::Get(FormattersMatchData &match_data,
  33. lldb::TypeFormatImplSP &format_sp) {
  34. if (!m_category_sp)
  35. return false;
  36. if (!IsEnabled())
  37. return false;
  38. if (match_data.GetTypeForCache()) {
  39. if (m_format_cache.GetFormat(match_data.GetTypeForCache(), format_sp))
  40. return format_sp.get() != nullptr;
  41. }
  42. ValueObject &valobj(match_data.GetValueObject());
  43. bool result =
  44. m_category_sp->Get(valobj, match_data.GetMatchesVector(), format_sp);
  45. if (match_data.GetTypeForCache() &&
  46. (!format_sp || !format_sp->NonCacheable())) {
  47. m_format_cache.SetFormat(match_data.GetTypeForCache(), format_sp);
  48. }
  49. return result;
  50. }
  51. bool LanguageCategory::Get(FormattersMatchData &match_data,
  52. lldb::TypeSummaryImplSP &format_sp) {
  53. if (!m_category_sp)
  54. return false;
  55. if (!IsEnabled())
  56. return false;
  57. if (match_data.GetTypeForCache()) {
  58. if (m_format_cache.GetSummary(match_data.GetTypeForCache(), format_sp))
  59. return format_sp.get() != nullptr;
  60. }
  61. ValueObject &valobj(match_data.GetValueObject());
  62. bool result =
  63. m_category_sp->Get(valobj, match_data.GetMatchesVector(), format_sp);
  64. if (match_data.GetTypeForCache() &&
  65. (!format_sp || !format_sp->NonCacheable())) {
  66. m_format_cache.SetSummary(match_data.GetTypeForCache(), format_sp);
  67. }
  68. return result;
  69. }
  70. bool LanguageCategory::Get(FormattersMatchData &match_data,
  71. lldb::SyntheticChildrenSP &format_sp) {
  72. if (!m_category_sp)
  73. return false;
  74. if (!IsEnabled())
  75. return false;
  76. if (match_data.GetTypeForCache()) {
  77. if (m_format_cache.GetSynthetic(match_data.GetTypeForCache(), format_sp))
  78. return format_sp.get() != nullptr;
  79. }
  80. ValueObject &valobj(match_data.GetValueObject());
  81. bool result =
  82. m_category_sp->Get(valobj, match_data.GetMatchesVector(), format_sp);
  83. if (match_data.GetTypeForCache() &&
  84. (!format_sp || !format_sp->NonCacheable())) {
  85. m_format_cache.SetSynthetic(match_data.GetTypeForCache(), format_sp);
  86. }
  87. return result;
  88. }
  89. bool LanguageCategory::Get(FormattersMatchData &match_data,
  90. lldb::TypeValidatorImplSP &format_sp) {
  91. if (!m_category_sp)
  92. return false;
  93. if (!IsEnabled())
  94. return false;
  95. if (match_data.GetTypeForCache()) {
  96. if (m_format_cache.GetValidator(match_data.GetTypeForCache(), format_sp))
  97. return format_sp.get() != nullptr;
  98. }
  99. ValueObject &valobj(match_data.GetValueObject());
  100. bool result =
  101. m_category_sp->Get(valobj, match_data.GetMatchesVector(), format_sp);
  102. if (match_data.GetTypeForCache() &&
  103. (!format_sp || !format_sp->NonCacheable())) {
  104. m_format_cache.SetValidator(match_data.GetTypeForCache(), format_sp);
  105. }
  106. return result;
  107. }
  108. bool LanguageCategory::GetHardcoded(FormatManager &fmt_mgr,
  109. FormattersMatchData &match_data,
  110. lldb::TypeFormatImplSP &format_sp) {
  111. if (!IsEnabled())
  112. return false;
  113. ValueObject &valobj(match_data.GetValueObject());
  114. lldb::DynamicValueType use_dynamic(match_data.GetDynamicValueType());
  115. for (auto &candidate : m_hardcoded_formats) {
  116. if ((format_sp = candidate(valobj, use_dynamic, fmt_mgr)))
  117. break;
  118. }
  119. if (match_data.GetTypeForCache() &&
  120. (!format_sp || !format_sp->NonCacheable())) {
  121. m_format_cache.SetFormat(match_data.GetTypeForCache(), format_sp);
  122. }
  123. return format_sp.get() != nullptr;
  124. }
  125. bool LanguageCategory::GetHardcoded(FormatManager &fmt_mgr,
  126. FormattersMatchData &match_data,
  127. lldb::TypeSummaryImplSP &format_sp) {
  128. if (!IsEnabled())
  129. return false;
  130. ValueObject &valobj(match_data.GetValueObject());
  131. lldb::DynamicValueType use_dynamic(match_data.GetDynamicValueType());
  132. for (auto &candidate : m_hardcoded_summaries) {
  133. if ((format_sp = candidate(valobj, use_dynamic, fmt_mgr)))
  134. break;
  135. }
  136. if (match_data.GetTypeForCache() &&
  137. (!format_sp || !format_sp->NonCacheable())) {
  138. m_format_cache.SetSummary(match_data.GetTypeForCache(), format_sp);
  139. }
  140. return format_sp.get() != nullptr;
  141. }
  142. bool LanguageCategory::GetHardcoded(FormatManager &fmt_mgr,
  143. FormattersMatchData &match_data,
  144. lldb::SyntheticChildrenSP &format_sp) {
  145. if (!IsEnabled())
  146. return false;
  147. ValueObject &valobj(match_data.GetValueObject());
  148. lldb::DynamicValueType use_dynamic(match_data.GetDynamicValueType());
  149. for (auto &candidate : m_hardcoded_synthetics) {
  150. if ((format_sp = candidate(valobj, use_dynamic, fmt_mgr)))
  151. break;
  152. }
  153. if (match_data.GetTypeForCache() &&
  154. (!format_sp || !format_sp->NonCacheable())) {
  155. m_format_cache.SetSynthetic(match_data.GetTypeForCache(), format_sp);
  156. }
  157. return format_sp.get() != nullptr;
  158. }
  159. bool LanguageCategory::GetHardcoded(FormatManager &fmt_mgr,
  160. FormattersMatchData &match_data,
  161. lldb::TypeValidatorImplSP &format_sp) {
  162. if (!IsEnabled())
  163. return false;
  164. ValueObject &valobj(match_data.GetValueObject());
  165. lldb::DynamicValueType use_dynamic(match_data.GetDynamicValueType());
  166. for (auto &candidate : m_hardcoded_validators) {
  167. if ((format_sp = candidate(valobj, use_dynamic, fmt_mgr)))
  168. break;
  169. }
  170. if (match_data.GetTypeForCache() &&
  171. (!format_sp || !format_sp->NonCacheable())) {
  172. m_format_cache.SetValidator(match_data.GetTypeForCache(), format_sp);
  173. }
  174. return format_sp.get() != nullptr;
  175. }
  176. lldb::TypeCategoryImplSP LanguageCategory::GetCategory() const {
  177. return m_category_sp;
  178. }
  179. FormatCache &LanguageCategory::GetFormatCache() { return m_format_cache; }
  180. void LanguageCategory::Enable() {
  181. if (m_category_sp)
  182. m_category_sp->Enable(true, TypeCategoryMap::Default);
  183. m_enabled = true;
  184. }
  185. void LanguageCategory::Disable() {
  186. if (m_category_sp)
  187. m_category_sp->Disable();
  188. m_enabled = false;
  189. }
  190. bool LanguageCategory::IsEnabled() { return m_enabled; }