1 //===-- SBSymbol.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_API_SBSYMBOL_H
10 #define LLDB_API_SBSYMBOL_H
11 
12 #include "lldb/API/SBAddress.h"
13 #include "lldb/API/SBDefines.h"
14 #include "lldb/API/SBInstructionList.h"
15 #include "lldb/API/SBTarget.h"
16 
17 namespace lldb {
18 
19 class LLDB_API SBSymbol {
20 public:
21   SBSymbol();
22 
23   ~SBSymbol();
24 
25   SBSymbol(const lldb::SBSymbol &rhs);
26 
27   const lldb::SBSymbol &operator=(const lldb::SBSymbol &rhs);
28 
29   explicit operator bool() const;
30 
31   bool IsValid() const;
32 
33   const char *GetName() const;
34 
35   const char *GetDisplayName() const;
36 
37   const char *GetMangledName() const;
38 
39   lldb::SBInstructionList GetInstructions(lldb::SBTarget target);
40 
41   lldb::SBInstructionList GetInstructions(lldb::SBTarget target,
42                                           const char *flavor_string);
43 
44   /// Get the start address of this symbol
45   ///
46   /// \returns
47   ///   If the symbol's value is not an address, an invalid SBAddress object
48   ///   will be returned. If the symbol's value is an address, a valid SBAddress
49   ///   object will be returned.
50   SBAddress GetStartAddress();
51 
52   /// Get the end address of this symbol
53   ///
54   /// \returns
55   ///   If the symbol's value is not an address, an invalid SBAddress object
56   ///   will be returned. If the symbol's value is an address, a valid SBAddress
57   ///   object will be returned.
58   SBAddress GetEndAddress();
59 
60   /// Get the raw value of a symbol.
61   ///
62   /// This accessor allows direct access to the symbol's value from the symbol
63   /// table regardless of what the value is. The value can be a file address or
64   /// it can be an integer value that depends on what the symbol's type is. Some
65   /// symbol values are not addresses, but absolute values or integer values
66   /// that can be mean different things. The GetStartAddress() accessor will
67   /// only return a valid SBAddress if the symbol's value is an address, so this
68   /// accessor provides a way to access the symbol's value when the value is
69   /// not an address.
70   ///
71   /// \returns
72   ///   Returns the raw integer value of a symbol from the symbol table.
73   uint64_t GetValue();
74 
75   /// Get the size of the symbol.
76   ///
77   /// This accessor allows direct access to the symbol's size from the symbol
78   /// table regardless of what the value is (address or integer value).
79   ///
80   /// \returns
81   ///   Returns the size of a symbol from the symbol table.
82   uint64_t GetSize();
83 
84   uint32_t GetPrologueByteSize();
85 
86   SymbolType GetType();
87 
88   bool operator==(const lldb::SBSymbol &rhs) const;
89 
90   bool operator!=(const lldb::SBSymbol &rhs) const;
91 
92   bool GetDescription(lldb::SBStream &description);
93 
94   // Returns true if the symbol is externally visible in the module that it is
95   // defined in
96   bool IsExternal();
97 
98   // Returns true if the symbol was synthetically generated from something
99   // other than the actual symbol table itself in the object file.
100   bool IsSynthetic();
101 
102 protected:
103   lldb_private::Symbol *get();
104 
105   void reset(lldb_private::Symbol *);
106 
107 private:
108   friend class SBAddress;
109   friend class SBFrame;
110   friend class SBModule;
111   friend class SBSymbolContext;
112 
113   SBSymbol(lldb_private::Symbol *lldb_object_ptr);
114 
115   void SetSymbol(lldb_private::Symbol *lldb_object_ptr);
116 
117   lldb_private::Symbol *m_opaque_ptr = nullptr;
118 };
119 
120 } // namespace lldb
121 
122 #endif // LLDB_API_SBSYMBOL_H
123