• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===-- Address.h -----------------------------------------------*- 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 #ifndef liblldb_Address_h_
11 #define liblldb_Address_h_
12 
13 // C Includes
14 // C++ Includes
15 #include <atomic>
16 // Other libraries and framework includes
17 // Project includes
18 #include "lldb/lldb-private.h"
19 #include "lldb/Symbol/SymbolContextScope.h"
20 
21 namespace lldb_private {
22 
23 //----------------------------------------------------------------------
24 /// @class Address Address.h "lldb/Core/Address.h"
25 /// @brief A section + offset based address class.
26 ///
27 /// The Address class allows addresses to be relative to a section
28 /// that can move during runtime due to images (executables, shared
29 /// libraries, bundles, frameworks) being loaded at different
30 /// addresses than the addresses found in the object file that
31 /// represents them on disk. There are currently two types of addresses
32 /// for a section:
33 ///     @li file addresses
34 ///     @li load addresses
35 ///
36 /// File addresses represent the virtual addresses that are in the "on
37 /// disk" object files. These virtual addresses are converted to be
38 /// relative to unique sections scoped to the object file so that
39 /// when/if the addresses slide when the images are loaded/unloaded
40 /// in memory, we can easily track these changes without having to
41 /// update every object (compile unit ranges, line tables, function
42 /// address ranges, lexical block and inlined subroutine address
43 /// ranges, global and static variables) each time an image is loaded or
44 /// unloaded.
45 ///
46 /// Load addresses represent the virtual addresses where each section
47 /// ends up getting loaded at runtime. Before executing a program, it
48 /// is common for all of the load addresses to be unresolved. When a
49 /// DynamicLoader plug-in receives notification that shared libraries
50 /// have been loaded/unloaded, the load addresses of the main executable
51 /// and any images (shared libraries) will be  resolved/unresolved. When
52 /// this happens, breakpoints that are in one of these sections can be
53 /// set/cleared.
54 //----------------------------------------------------------------------
55 class Address
56 {
57 public:
58     //------------------------------------------------------------------
59     /// Dump styles allow the Address::Dump(Stream *,DumpStyle) const
60     /// function to display Address contents in a variety of ways.
61     //------------------------------------------------------------------
62     typedef enum {
63         DumpStyleInvalid,               ///< Invalid dump style
64         DumpStyleSectionNameOffset,     ///< Display as the section name + offset.
65                                         ///< \code
66                                         /// // address for printf in libSystem.B.dylib as a section name + offset
67                                         /// libSystem.B.dylib.__TEXT.__text + 0x0005cfdf
68                                         /// \endcode
69         DumpStyleSectionPointerOffset,  ///< Display as the section pointer + offset (debug output).
70                                         ///< \code
71                                         /// // address for printf in libSystem.B.dylib as a section pointer + offset
72                                         /// (lldb::Section *)0x35cc50 + 0x000000000005cfdf \endcode
73         DumpStyleFileAddress,           ///< Display as the file address (if any).
74                                         ///< \code
75                                         /// // address for printf in libSystem.B.dylib as a file address
76                                         /// 0x000000000005dcff \endcode
77         DumpStyleModuleWithFileAddress, ///< Display as the file address with the module name prepended (if any).
78                                         ///< \code
79                                         /// // address for printf in libSystem.B.dylib as a file address
80                                         /// libSystem.B.dylib[0x000000000005dcff] \endcode
81         DumpStyleLoadAddress,           ///< Display as the load address (if resolved).
82                                         ///< \code
83                                         /// // address for printf in libSystem.B.dylib as a load address
84                                         /// 0x00007fff8306bcff \endcode
85         DumpStyleResolvedDescription,   ///< Display the details about what an address resolves to. This can
86                                         ///< be anything from a symbol context summary (module, function/symbol,
87                                         ///< and file and line), to information about what the pointer points to
88                                         ///< if the address is in a section (section of pointers, c strings, etc).
89         DumpStyleResolvedDescriptionNoModule,
90         DumpStyleDetailedSymbolContext, ///< Detailed symbol context information for an address for all symbol
91                                         ///< context members.
92         DumpStyleResolvedPointerDescription ///< Dereference a pointer at the current address and then lookup the
93                                              ///< dereferenced address using DumpStyleResolvedDescription
94     } DumpStyle;
95 
96     //------------------------------------------------------------------
97     /// Default constructor.
98     ///
99     /// Initialize with a invalid section (NULL) and an invalid
100     /// offset (LLDB_INVALID_ADDRESS).
101     //------------------------------------------------------------------
Address()102     Address () :
103         m_section_wp (),
104         m_offset (LLDB_INVALID_ADDRESS)
105     {
106     }
107 
108 
109     //------------------------------------------------------------------
110     /// Copy constructor
111     ///
112     /// Makes a copy of the another Address object \a rhs.
113     ///
114     /// @param[in] rhs
115     ///     A const Address object reference to copy.
116     //------------------------------------------------------------------
Address(const Address & rhs)117     Address (const Address& rhs) :
118         m_section_wp (rhs.m_section_wp),
119         m_offset(rhs.m_offset.load())
120     {
121     }
122 
123     //------------------------------------------------------------------
124     /// Construct with a section pointer and offset.
125     ///
126     /// Initialize the address with the supplied \a section and \a
127     /// offset.
128     ///
129     /// @param[in] section
130     ///     A section pointer to a valid lldb::Section, or NULL if the
131     ///     address doesn't have a section or will get resolved later.
132     ///
133     /// @param[in] offset
134     ///     The offset in bytes into \a section.
135     //------------------------------------------------------------------
Address(const lldb::SectionSP & section_sp,lldb::addr_t offset)136     Address (const lldb::SectionSP &section_sp, lldb::addr_t offset) :
137         m_section_wp (), // Don't init with section_sp in case section_sp is invalid (the weak_ptr will throw)
138         m_offset (offset)
139     {
140         if (section_sp)
141             m_section_wp = section_sp;
142     }
143 
144     //------------------------------------------------------------------
145     /// Construct with a virtual address and section list.
146     ///
147     /// Initialize and resolve the address with the supplied virtual
148     /// address \a file_addr.
149     ///
150     /// @param[in] file_addr
151     ///     A virtual file address.
152     ///
153     /// @param[in] section_list
154     ///     A list of sections, one of which may contain the \a file_addr.
155     //------------------------------------------------------------------
156     Address (lldb::addr_t file_addr, const SectionList * section_list);
157 
158     Address (lldb::addr_t abs_addr);
159 
160     //------------------------------------------------------------------
161     /// Assignment operator.
162     ///
163     /// Copies the address value from another Address object \a rhs
164     /// into \a this object.
165     ///
166     /// @param[in] rhs
167     ///     A const Address object reference to copy.
168     ///
169     /// @return
170     ///     A const Address object reference to \a this.
171     //------------------------------------------------------------------
172 #ifndef SWIG
173     const Address&
174     operator= (const Address& rhs);
175 #endif
176     //------------------------------------------------------------------
177     /// Clear the object's state.
178     ///
179     /// Sets the section to an invalid value (NULL) and an invalid
180     /// offset (LLDB_INVALID_ADDRESS).
181     //------------------------------------------------------------------
182     void
Clear()183     Clear ()
184     {
185         m_section_wp.reset();
186         m_offset = LLDB_INVALID_ADDRESS;
187     }
188 
189     //------------------------------------------------------------------
190     /// Compare two Address objects.
191     ///
192     /// @param[in] lhs
193     ///     The Left Hand Side const Address object reference.
194     ///
195     /// @param[in] rhs
196     ///     The Right Hand Side const Address object reference.
197     ///
198     /// @return
199     ///     @li -1 if lhs < rhs
200     ///     @li 0 if lhs == rhs
201     ///     @li 1 if lhs > rhs
202     //------------------------------------------------------------------
203     static int
204     CompareFileAddress (const Address& lhs, const Address& rhs);
205 
206     static int
207     CompareLoadAddress (const Address& lhs, const Address& rhs, Target *target);
208 
209     static int
210     CompareModulePointerAndOffset (const Address& lhs, const Address& rhs);
211 
212     // For use with std::map, std::multi_map
213     class ModulePointerAndOffsetLessThanFunctionObject
214     {
215     public:
ModulePointerAndOffsetLessThanFunctionObject()216         ModulePointerAndOffsetLessThanFunctionObject () {}
217 
218         bool
operator()219         operator() (const Address& a, const Address& b) const
220         {
221             return Address::CompareModulePointerAndOffset(a, b) < 0;
222         }
223     };
224 
225     //------------------------------------------------------------------
226     /// Dump a description of this object to a Stream.
227     ///
228     /// Dump a description of the contents of this object to the
229     /// supplied stream \a s. There are many ways to display a section
230     /// offset based address, and \a style lets the user choose.
231     ///
232     /// @param[in] s
233     ///     The stream to which to dump the object descripton.
234     ///
235     /// @param[in] style
236     ///     The display style for the address.
237     ///
238     /// @param[in] fallback_style
239     ///     The display style for the address.
240     ///
241     /// @return
242     ///     Returns \b true if the address was able to be displayed.
243     ///     File and load addresses may be unresolved and it may not be
244     ///     possible to display a valid value, \b false will be returned
245     ///     in such cases.
246     ///
247     /// @see Address::DumpStyle
248     //------------------------------------------------------------------
249     bool
250     Dump (Stream *s,
251           ExecutionContextScope *exe_scope,
252           DumpStyle style,
253           DumpStyle fallback_style = DumpStyleInvalid,
254           uint32_t addr_byte_size = UINT32_MAX) const;
255 
256     lldb::AddressClass
257     GetAddressClass () const;
258 
259     //------------------------------------------------------------------
260     /// Get the file address.
261     ///
262     /// If an address comes from a file on disk that has section
263     /// relative addresses, then it has a virtual address that is
264     /// relative to unique section in the object file.
265     ///
266     /// @return
267     ///     The valid file virtual address, or LLDB_INVALID_ADDRESS if
268     ///     the address doesn't have a file virtual address (image is
269     ///     from memory only with no representation on disk).
270     //------------------------------------------------------------------
271     lldb::addr_t
272     GetFileAddress () const;
273 
274     //------------------------------------------------------------------
275     /// Get the load address.
276     ///
277     /// If an address comes from a file on disk that has section
278     /// relative addresses, then it has a virtual address that is
279     /// relative to unique section in the object file. Sections get
280     /// resolved at runtime by DynamicLoader plug-ins as images
281     /// (executables and shared libraries) get loaded/unloaded. If a
282     /// section is loaded, then the load address can be resolved.
283     ///
284     /// @return
285     ///     The valid load virtual address, or LLDB_INVALID_ADDRESS if
286     ///     the address is currently not loaded.
287     //------------------------------------------------------------------
288     lldb::addr_t
289     GetLoadAddress (Target *target) const;
290 
291     //------------------------------------------------------------------
292     /// Get the load address as a callable code load address.
293     ///
294     /// This function will first resolve its address to a load address.
295     /// Then, if the address turns out to be in code address, return the
296     /// load address that would be required to call or return to. The
297     /// address might have extra bits set (bit zero will be set to Thumb
298     /// functions for an ARM target) that are required when changing the
299     /// program counter to setting a return address.
300     ///
301     /// @return
302     ///     The valid load virtual address, or LLDB_INVALID_ADDRESS if
303     ///     the address is currently not loaded.
304     //------------------------------------------------------------------
305     lldb::addr_t
306     GetCallableLoadAddress (Target *target, bool is_indirect = false) const;
307 
308     //------------------------------------------------------------------
309     /// Get the load address as an opcode load address.
310     ///
311     /// This function will first resolve its address to a load address.
312     /// Then, if the address turns out to be in code address, return the
313     /// load address for a an opcode. This address object might have
314     /// extra bits set (bit zero will be set to Thumb functions for an
315     /// ARM target) that are required for changing the program counter
316     /// and this function will remove any bits that are intended for
317     /// these special purposes. The result of this function can be used
318     /// to safely write a software breakpoint trap to memory.
319     ///
320     /// @return
321     ///     The valid load virtual address with extra callable bits
322     ///     removed, or LLDB_INVALID_ADDRESS if the address is currently
323     ///     not loaded.
324     //------------------------------------------------------------------
325     lldb::addr_t
326     GetOpcodeLoadAddress (Target *target) const;
327 
328     //------------------------------------------------------------------
329     /// Get the section relative offset value.
330     ///
331     /// @return
332     ///     The current offset, or LLDB_INVALID_ADDRESS if this address
333     ///     doesn't contain a valid offset.
334     //------------------------------------------------------------------
335     lldb::addr_t
GetOffset()336     GetOffset () const { return m_offset; }
337 
338     //------------------------------------------------------------------
339     /// Check if an address is section offset.
340     ///
341     /// When converting a virtual file or load address into a section
342     /// offset based address, we often need to know if, given a section
343     /// list, if the address was able to be converted to section offset.
344     /// This function returns true if the current value contained in
345     /// this object is section offset based.
346     ///
347     /// @return
348     ///     Returns \b true if the address has a valid section and
349     ///     offset, \b false otherwise.
350     //------------------------------------------------------------------
351     bool
IsSectionOffset()352     IsSectionOffset() const
353     {
354         return IsValid() && (GetSection().get() != NULL);
355     }
356 
357     //------------------------------------------------------------------
358     /// Check if the object state is valid.
359     ///
360     /// A valid Address object contains either a section pointer and
361     /// and offset (for section offset based addresses), or just a valid
362     /// offset (for absolute addresses that have no section).
363     ///
364     /// @return
365     ///     Returns \b true if the the offset is valid, \b false
366     ///     otherwise.
367     //------------------------------------------------------------------
368     bool
IsValid()369     IsValid() const
370     {
371         return m_offset != LLDB_INVALID_ADDRESS;
372     }
373 
374 
375     //------------------------------------------------------------------
376     /// Get the memory cost of this object.
377     ///
378     /// @return
379     ///     The number of bytes that this object occupies in memory.
380     //------------------------------------------------------------------
381     size_t
382     MemorySize () const;
383 
384     //------------------------------------------------------------------
385     /// Resolve a file virtual address using a section list.
386     ///
387     /// Given a list of sections, attempt to resolve \a addr as a
388     /// an offset into one of the file sections.
389     ///
390     /// @return
391     ///     Returns \b true if \a addr was able to be resolved, \b false
392     ///     otherwise.
393     //------------------------------------------------------------------
394     bool
395     ResolveAddressUsingFileSections (lldb::addr_t addr, const SectionList *sections);
396 
397     //------------------------------------------------------------------
398     /// Set the address to represent \a load_addr.
399     ///
400     /// The address will attempt to find a loaded section within
401     /// \a target that contains \a load_addr. If successful, this
402     /// address object will have a valid section and offset. Else this
403     /// address object will have no section (NULL) and the offset will
404     /// be \a load_addr.
405     ///
406     /// @param[in] load_addr
407     ///     A load address from a current process.
408     ///
409     /// @param[in] target
410     ///     The target to use when trying resolve the address into
411     ///     a section + offset. The Target's SectionLoadList object
412     ///     is used to resolve the address.
413     ///
414     /// @return
415     ///     Returns \b true if the load address was resolved to be
416     ///     section/offset, \b false otherwise. It is often ok for an
417     ///     address no not resolve to a section in a module, this often
418     ///     happens for JIT'ed code, or any load addresses on the stack
419     ///     or heap.
420     //------------------------------------------------------------------
421     bool
422     SetLoadAddress (lldb::addr_t load_addr, Target *target);
423 
424     bool
425     SetOpcodeLoadAddress (lldb::addr_t load_addr, Target *target);
426 
427     bool
428     SetCallableLoadAddress (lldb::addr_t load_addr, Target *target);
429 
430     //------------------------------------------------------------------
431     /// Get accessor for the module for this address.
432     ///
433     /// @return
434     ///     Returns the Module pointer that this address is an offset
435     ///     in, or NULL if this address doesn't belong in a module, or
436     ///     isn't resolved yet.
437     //------------------------------------------------------------------
438     lldb::ModuleSP
439     GetModule () const;
440 
441     //------------------------------------------------------------------
442     /// Get const accessor for the section.
443     ///
444     /// @return
445     ///     Returns the const lldb::Section pointer that this address is an
446     ///     offset in, or NULL if this address is absolute.
447     //------------------------------------------------------------------
448     lldb::SectionSP
GetSection()449     GetSection () const { return m_section_wp.lock(); }
450 
451     //------------------------------------------------------------------
452     /// Set accessor for the offset.
453     ///
454     /// @param[in] offset
455     ///     A new offset value for this object.
456     ///
457     /// @return
458     ///     Returns \b true if the offset changed, \b false otherwise.
459     //------------------------------------------------------------------
460     bool
SetOffset(lldb::addr_t offset)461     SetOffset (lldb::addr_t offset)
462     {
463         bool changed = m_offset != offset;
464         m_offset = offset;
465         return changed;
466     }
467 
468     void
SetRawAddress(lldb::addr_t addr)469     SetRawAddress (lldb::addr_t addr)
470     {
471         m_section_wp.reset();
472         m_offset = addr;
473     }
474 
475     bool
Slide(int64_t offset)476     Slide (int64_t offset)
477     {
478         if (m_offset != LLDB_INVALID_ADDRESS)
479         {
480             m_offset += offset;
481             return true;
482         }
483         return false;
484     }
485 
486     //------------------------------------------------------------------
487     /// Set accessor for the section.
488     ///
489     /// @param[in] section
490     ///     A new lldb::Section pointer to use as the section base. Can
491     ///     be NULL for absolute addresses that are not relative to
492     ///     any section.
493     //------------------------------------------------------------------
494     void
SetSection(const lldb::SectionSP & section_sp)495     SetSection (const lldb::SectionSP &section_sp)
496     {
497         m_section_wp = section_sp;
498     }
499 
500     void
ClearSection()501     ClearSection ()
502     {
503         m_section_wp.reset();
504     }
505     //------------------------------------------------------------------
506     /// Reconstruct a symbol context from an address.
507     ///
508     /// This class doesn't inherit from SymbolContextScope because many
509     /// address objects have short lifespans. Address objects that are
510     /// section offset can reconstruct their symbol context by looking
511     /// up the address in the module found in the section.
512     ///
513     /// @see SymbolContextScope::CalculateSymbolContext(SymbolContext*)
514     //------------------------------------------------------------------
515     uint32_t
516     CalculateSymbolContext (SymbolContext *sc,
517                             uint32_t resolve_scope = lldb::eSymbolContextEverything) const;
518 
519     lldb::ModuleSP
520     CalculateSymbolContextModule () const;
521 
522     CompileUnit *
523     CalculateSymbolContextCompileUnit () const;
524 
525     Function *
526     CalculateSymbolContextFunction () const;
527 
528     Block *
529     CalculateSymbolContextBlock () const;
530 
531     Symbol *
532     CalculateSymbolContextSymbol () const;
533 
534     bool
535     CalculateSymbolContextLineEntry (LineEntry &line_entry) const;
536 
537 protected:
538     //------------------------------------------------------------------
539     // Member variables.
540     //------------------------------------------------------------------
541     lldb::SectionWP m_section_wp;   ///< The section for the address, can be NULL.
542     std::atomic<lldb::addr_t> m_offset;      ///< Offset into section if \a m_section_wp is valid...
543 };
544 
545 
546 //----------------------------------------------------------------------
547 // NOTE: Be careful using this operator. It can correctly compare two
548 // addresses from the same Module correctly. It can't compare two
549 // addresses from different modules in any meaningful way, but it will
550 // compare the module pointers.
551 //
552 // To sum things up:
553 // - works great for addresses within the same module
554 // - it works for addresses across multiple modules, but don't expect the
555 //   address results to make much sense
556 //
557 // This basically lets Address objects be used in ordered collection
558 // classes.
559 //----------------------------------------------------------------------
560 bool operator<  (const Address& lhs, const Address& rhs);
561 bool operator>  (const Address& lhs, const Address& rhs);
562 
563 
564 
565 bool operator== (const Address& lhs, const Address& rhs);
566 bool operator!= (const Address& lhs, const Address& rhs);
567 
568 } // namespace lldb_private
569 
570 #endif  // liblldb_Address_h_
571