Coverage Report

Created: 2022-01-18 06:27

/Users/buildslave/jenkins/workspace/coverage/llvm-project/lldb/source/Plugins/LanguageRuntime/CPlusPlus/ItaniumABI/ItaniumABILanguageRuntime.h
Line
Count
Source (jump to first uncovered line)
1
//===-- ItaniumABILanguageRuntime.h -----------------------------*- C++ -*-===//
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
#ifndef LLDB_SOURCE_PLUGINS_LANGUAGERUNTIME_CPLUSPLUS_ITANIUMABI_ITANIUMABILANGUAGERUNTIME_H
10
#define LLDB_SOURCE_PLUGINS_LANGUAGERUNTIME_CPLUSPLUS_ITANIUMABI_ITANIUMABILANGUAGERUNTIME_H
11
12
#include <map>
13
#include <mutex>
14
#include <vector>
15
16
#include "lldb/Breakpoint/BreakpointResolver.h"
17
#include "lldb/Core/Value.h"
18
#include "lldb/Symbol/Type.h"
19
#include "lldb/Target/LanguageRuntime.h"
20
#include "lldb/lldb-private.h"
21
22
#include "Plugins/LanguageRuntime/CPlusPlus/CPPLanguageRuntime.h"
23
24
namespace lldb_private {
25
26
class ItaniumABILanguageRuntime : public lldb_private::CPPLanguageRuntime {
27
public:
28
3.46k
  ~ItaniumABILanguageRuntime() override = default;
29
30
  // Static Functions
31
  static void Initialize();
32
33
  static void Terminate();
34
35
  static lldb_private::LanguageRuntime *
36
  CreateInstance(Process *process, lldb::LanguageType language);
37
38
3.44k
  static llvm::StringRef GetPluginNameStatic() { return "itanium"; }
39
40
  static char ID;
41
42
8.28k
  bool isA(const void *ClassID) const override {
43
8.28k
    return ClassID == &ID || CPPLanguageRuntime::isA(ClassID);
44
8.28k
  }
45
46
0
  static bool classof(const LanguageRuntime *runtime) {
47
0
    return runtime->isA(&ID);
48
0
  }
49
50
  bool GetDynamicTypeAndAddress(ValueObject &in_value,
51
                                lldb::DynamicValueType use_dynamic,
52
                                TypeAndOrName &class_type_or_name,
53
                                Address &address,
54
                                Value::ValueType &value_type) override;
55
56
  TypeAndOrName FixUpDynamicType(const TypeAndOrName &type_and_or_name,
57
                                 ValueObject &static_value) override;
58
59
  bool CouldHaveDynamicValue(ValueObject &in_value) override;
60
61
  void SetExceptionBreakpoints() override;
62
63
  void ClearExceptionBreakpoints() override;
64
65
  bool ExceptionBreakpointsAreSet() override;
66
67
  bool ExceptionBreakpointsExplainStop(lldb::StopInfoSP stop_reason) override;
68
69
  lldb::BreakpointResolverSP
70
  CreateExceptionResolver(const lldb::BreakpointSP &bkpt,
71
                          bool catch_bp, bool throw_bp) override;
72
73
  lldb::SearchFilterSP CreateExceptionSearchFilter() override;
74
  
75
  lldb::ValueObjectSP GetExceptionObjectForThread(
76
      lldb::ThreadSP thread_sp) override;
77
78
  // PluginInterface protocol
79
0
  llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); }
80
81
protected:
82
  lldb::BreakpointResolverSP
83
  CreateExceptionResolver(const lldb::BreakpointSP &bkpt,
84
                          bool catch_bp, bool throw_bp, bool for_expressions);
85
86
  lldb::BreakpointSP CreateExceptionBreakpoint(bool catch_bp, bool throw_bp,
87
                                               bool for_expressions,
88
                                               bool is_internal);
89
90
private:
91
  typedef std::map<lldb_private::Address, TypeAndOrName> DynamicTypeCache;
92
93
  ItaniumABILanguageRuntime(Process *process)
94
      : // Call CreateInstance instead.
95
        lldb_private::CPPLanguageRuntime(process), m_cxx_exception_bp_sp(),
96
3.46k
        m_dynamic_type_map(), m_dynamic_type_map_mutex() {}
97
98
  lldb::BreakpointSP m_cxx_exception_bp_sp;
99
  DynamicTypeCache m_dynamic_type_map;
100
  std::mutex m_dynamic_type_map_mutex;
101
102
  TypeAndOrName GetTypeInfoFromVTableAddress(ValueObject &in_value,
103
                                             lldb::addr_t original_ptr,
104
                                             lldb::addr_t vtable_addr);
105
106
  TypeAndOrName GetDynamicTypeInfo(const lldb_private::Address &vtable_addr);
107
108
  void SetDynamicTypeInfo(const lldb_private::Address &vtable_addr,
109
                          const TypeAndOrName &type_info);
110
};
111
112
} // namespace lldb_private
113
114
#endif // LLDB_SOURCE_PLUGINS_LANGUAGERUNTIME_CPLUSPLUS_ITANIUMABI_ITANIUMABILANGUAGERUNTIME_H