• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===-- SWIG Interface for SBAddress ----------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 namespace lldb {
11 
12 %feature("docstring",
13 "A section + offset based address class.
14 
15 The SBAddress class allows addresses to be relative to a section
16 that can move during runtime due to images (executables, shared
17 libraries, bundles, frameworks) being loaded at different
18 addresses than the addresses found in the object file that
19 represents them on disk. There are currently two types of addresses
20 for a section:
21     o file addresses
22     o load addresses
23 
24 File addresses represents the virtual addresses that are in the 'on
25 disk' object files. These virtual addresses are converted to be
26 relative to unique sections scoped to the object file so that
27 when/if the addresses slide when the images are loaded/unloaded
28 in memory, we can easily track these changes without having to
29 update every object (compile unit ranges, line tables, function
30 address ranges, lexical block and inlined subroutine address
31 ranges, global and static variables) each time an image is loaded or
32 unloaded.
33 
34 Load addresses represents the virtual addresses where each section
35 ends up getting loaded at runtime. Before executing a program, it
36 is common for all of the load addresses to be unresolved. When a
37 DynamicLoader plug-in receives notification that shared libraries
38 have been loaded/unloaded, the load addresses of the main executable
39 and any images (shared libraries) will be  resolved/unresolved. When
40 this happens, breakpoints that are in one of these sections can be
41 set/cleared.
42 
43 See docstring of SBFunction for example usage of SBAddress."
44 ) SBAddress;
45 class SBAddress
46 {
47 public:
48 
49     SBAddress ();
50 
51     SBAddress (const lldb::SBAddress &rhs);
52 
53     SBAddress (lldb::SBSection section,
54                lldb::addr_t offset);
55 
56     %feature("docstring", "
57     Create an address by resolving a load address using the supplied target.
58     ") SBAddress;
59     SBAddress (lldb::addr_t load_addr, lldb::SBTarget &target);
60 
61     ~SBAddress ();
62 
63     bool
64     IsValid () const;
65 
66     void
67     Clear ();
68 
69     addr_t
70     GetFileAddress () const;
71 
72     addr_t
73     GetLoadAddress (const lldb::SBTarget &target) const;
74 
75     void
76     SetLoadAddress (lldb::addr_t load_addr,
77                     lldb::SBTarget &target);
78 
79     bool
80     OffsetAddress (addr_t offset);
81 
82     bool
83     GetDescription (lldb::SBStream &description);
84 
85     lldb::SBSection
86     GetSection ();
87 
88     lldb::addr_t
89     SBAddress::GetOffset ();
90 
91     void
92     SetAddress (lldb::SBSection section,
93                 lldb::addr_t offset);
94 
95 
96     lldb::AddressClass
97     GetAddressClass ();
98 
99     %feature("docstring", "
100     //------------------------------------------------------------------
101     /// GetSymbolContext() and the following can lookup symbol information for a given address.
102     /// An address might refer to code or data from an existing module, or it
103     /// might refer to something on the stack or heap. The following functions
104     /// will only return valid values if the address has been resolved to a code
105     /// or data address using 'void SBAddress::SetLoadAddress(...)' or
106     /// 'lldb::SBAddress SBTarget::ResolveLoadAddress (...)'.
107     //------------------------------------------------------------------
108     ") GetSymbolContext;
109     lldb::SBSymbolContext
110     GetSymbolContext (uint32_t resolve_scope);
111 
112     %feature("docstring", "
113     //------------------------------------------------------------------
114     /// GetModule() and the following grab individual objects for a given address and
115     /// are less efficient if you want more than one symbol related objects.
116     /// Use one of the following when you want multiple debug symbol related
117     /// objects for an address:
118     ///    lldb::SBSymbolContext SBAddress::GetSymbolContext (uint32_t resolve_scope);
119     ///    lldb::SBSymbolContext SBTarget::ResolveSymbolContextForAddress (const SBAddress &addr, uint32_t resolve_scope);
120     /// One or more bits from the SymbolContextItem enumerations can be logically
121     /// OR'ed together to more efficiently retrieve multiple symbol objects.
122     //------------------------------------------------------------------
123     ") GetModule;
124     lldb::SBModule
125     GetModule ();
126 
127     lldb::SBCompileUnit
128     GetCompileUnit ();
129 
130     lldb::SBFunction
131     GetFunction ();
132 
133     lldb::SBBlock
134     GetBlock ();
135 
136     lldb::SBSymbol
137     GetSymbol ();
138 
139     lldb::SBLineEntry
140     GetLineEntry ();
141 
142     %pythoncode %{
143         def __get_load_addr_property__ (self):
144             '''Get the load address for a lldb.SBAddress using the current target.'''
145             return self.GetLoadAddress (target)
146 
147         def __set_load_addr_property__ (self, load_addr):
148             '''Set the load address for a lldb.SBAddress using the current target.'''
149             return self.SetLoadAddress (load_addr, target)
150 
151         def __int__(self):
152             '''Convert an address to a load address if there is a process and that process is alive, or to a file address otherwise.'''
153             if process.is_alive:
154                 return self.GetLoadAddress (target)
155             else:
156                 return self.GetFileAddress ()
157 
158         def __oct__(self):
159             '''Convert the address to an octal string'''
160             return '%o' % int(self)
161 
162         def __hex__(self):
163             '''Convert the address to an hex string'''
164             return '0x%x' % int(self)
165 
166         __swig_getmethods__["module"] = GetModule
167         if _newclass: module = property(GetModule, None, doc='''A read only property that returns an lldb object that represents the module (lldb.SBModule) that this address resides within.''')
168 
169         __swig_getmethods__["compile_unit"] = GetCompileUnit
170         if _newclass: compile_unit = property(GetCompileUnit, None, doc='''A read only property that returns an lldb object that represents the compile unit (lldb.SBCompileUnit) that this address resides within.''')
171 
172         __swig_getmethods__["line_entry"] = GetLineEntry
173         if _newclass: line_entry = property(GetLineEntry, None, doc='''A read only property that returns an lldb object that represents the line entry (lldb.SBLineEntry) that this address resides within.''')
174 
175         __swig_getmethods__["function"] = GetFunction
176         if _newclass: function = property(GetFunction, None, doc='''A read only property that returns an lldb object that represents the function (lldb.SBFunction) that this address resides within.''')
177 
178         __swig_getmethods__["block"] = GetBlock
179         if _newclass: block = property(GetBlock, None, doc='''A read only property that returns an lldb object that represents the block (lldb.SBBlock) that this address resides within.''')
180 
181         __swig_getmethods__["symbol"] = GetSymbol
182         if _newclass: symbol = property(GetSymbol, None, doc='''A read only property that returns an lldb object that represents the symbol (lldb.SBSymbol) that this address resides within.''')
183 
184         __swig_getmethods__["offset"] = GetOffset
185         if _newclass: offset = property(GetOffset, None, doc='''A read only property that returns the section offset in bytes as an integer.''')
186 
187         __swig_getmethods__["section"] = GetSection
188         if _newclass: section = property(GetSection, None, doc='''A read only property that returns an lldb object that represents the section (lldb.SBSection) that this address resides within.''')
189 
190         __swig_getmethods__["file_addr"] = GetFileAddress
191         if _newclass: file_addr = property(GetFileAddress, None, doc='''A read only property that returns file address for the section as an integer. This is the address that represents the address as it is found in the object file that defines it.''')
192 
193         __swig_getmethods__["load_addr"] = __get_load_addr_property__
194         __swig_setmethods__["load_addr"] = __set_load_addr_property__
195         if _newclass: load_addr = property(__get_load_addr_property__, __set_load_addr_property__, doc='''A read/write property that gets/sets the SBAddress using load address. The setter resolves SBAddress using the SBTarget from lldb.target.''')
196 
197     %}
198 
199 };
200 
201 } // namespace lldb
202