<div dir="ltr">Here is a refinement of SBAddress.  The patch also includes updates to classes referenced by SBAddress.<div><br></div><div>Does this read better?</div><div><br></div><div>Thanks,</div><div>John</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Mar 9, 2016 at 11:56 AM, Jim Ingham <span dir="ltr"><<a href="mailto:jingham@apple.com" target="_blank">jingham@apple.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">In the case of something like SBAddress, I think it would be better to have a class header that explains file/load addresses and section offset addresses.  Then you can just use the terms in the function documentation, and they can be shorter and more explicit. Trying to define terms inline like this makes it harder both to define the term and to say what the function does.  It also means it is hard to avoid redundantly redefining terms as they are used in different functions.<br>
<br>
Thanks for starting this process!<br>
<br>
Jim<br>
<div><div class="h5"><br>
<br>
> On Mar 9, 2016, at 11:47 AM, John Lindal via lldb-commits <<a href="mailto:lldb-commits@lists.llvm.org">lldb-commits@lists.llvm.org</a>> wrote:<br>
><br>
> Having completed my C++ app on top of lldb, I would like to improve the function-level documentation so others don't have to blunder around in the dark the way I did :)<br>
><br>
> Here is a patch for SBAddress.h<br>
><br>
> If this is the right direction, I will work my way through the rest of the SB*.h files.<br>
><br>
> Thanks!<br>
> John Lindal<br>
><br>
> -----<br>
><br>
> diff --git a/include/lldb/API/SBAddress.h b/include/lldb/API/SBAddress.h<br>
> index 4cbbee9..b324e90 100644<br>
> --- a/include/lldb/API/SBAddress.h<br>
> +++ b/include/lldb/API/SBAddress.h<br>
> @@ -33,27 +33,100 @@ public:<br>
>      const lldb::SBAddress &<br>
>      operator = (const lldb::SBAddress &rhs);<br>
><br>
> +    //------------------------------------------------------------------<br>
> +    /// @return<br>
> +    ///     true if the object is valid.  If the object is invalid, it is<br>
> +    ///     not safe to call any other methods.<br>
> +    //------------------------------------------------------------------<br>
>      bool<br>
>      IsValid () const;<br>
><br>
> +    //------------------------------------------------------------------<br>
> +    /// Clears the address.  The object is no longer valid.<br>
> +    //------------------------------------------------------------------<br>
>      void<br>
>      Clear ();<br>
><br>
> +    //------------------------------------------------------------------<br>
> +    /// Get the file address.<br>
> +    ///<br>
> +    /// If an address comes from a file on disk that has section<br>
> +    /// relative addresses, then it has a virtual address that is<br>
> +    /// relative to a unique section in the object file.<br>
> +    ///<br>
> +    /// @return<br>
> +    ///     The valid file virtual address, or LLDB_INVALID_ADDRESS if<br>
> +    ///     the address doesn't have a file virtual address (image is<br>
> +    ///     from memory only with no representation on disk).<br>
> +    //------------------------------------------------------------------<br>
>      addr_t<br>
>      GetFileAddress () const;<br>
><br>
> +    //------------------------------------------------------------------<br>
> +    /// Get the load address.<br>
> +    ///<br>
> +    /// If an address comes from a file on disk that has section<br>
> +    /// relative addresses, then it has a virtual address that is<br>
> +    /// relative to a unique section in the object file. Sections<br>
> +    /// get resolved at runtime by DynamicLoader plug-ins as images<br>
> +    /// (executables and shared libraries) get loaded/unloaded. If a<br>
> +    /// section is loaded, then the load address can be resolved.<br>
> +    ///<br>
> +    /// @param[in] target<br>
> +    ///     The target in which to search.<br>
> +    ///<br>
> +    /// @return<br>
> +    ///     The valid load virtual address, or LLDB_INVALID_ADDRESS if<br>
> +    ///     the address is currently not loaded.<br>
> +    //------------------------------------------------------------------<br>
>      addr_t<br>
>      GetLoadAddress (const lldb::SBTarget &target) const;<br>
><br>
> +    //------------------------------------------------------------------<br>
> +    /// Set the section and address within the section.  If it succeeds,<br>
> +    /// the object becomes valid.<br>
> +    ///<br>
> +    /// @param[in] section<br>
> +    ///     A lldb::SBSection object to use as the section base.<br>
> +    ///<br>
> +    /// @param[in] offset<br>
> +    ///     A new offset value for this object.<br>
> +    //------------------------------------------------------------------<br>
>      void<br>
>      SetAddress (lldb::SBSection section, lldb::addr_t offset);<br>
><br>
> +    //------------------------------------------------------------------<br>
> +    /// Tries to resolve the address within the target.  If this fails,<br>
> +    /// assumes the address is absolute, e.g., on the stack or heap.  If it<br>
> +    /// succeeds, the object becomes valid.<br>
> +    ///<br>
> +    /// @param[in] load_addr<br>
> +    ///     A new offset value for this object.<br>
> +    ///<br>
> +    /// @param[in] target<br>
> +    ///     The target within which the offset is valid.<br>
> +    //------------------------------------------------------------------<br>
>      void<br>
>      SetLoadAddress (lldb::addr_t load_addr,<br>
>                      lldb::SBTarget &target);<br>
> +<br>
> +    //------------------------------------------------------------------<br>
> +    /// Set the offset for this address, relative to the current section,<br>
> +    /// if any.<br>
> +    ///<br>
> +    /// @param[in] offset<br>
> +    ///     A new offset value for this object.<br>
> +    //------------------------------------------------------------------<br>
> +    // FIXME:  Should this be SetOffsetAddress?<br>
>      bool<br>
>      OffsetAddress (addr_t offset);<br>
><br>
> +    //------------------------------------------------------------------<br>
> +    /// Dump a description of this object to the given lldb::SBStream.<br>
> +    ///<br>
> +    /// @param[in] description<br>
> +    ///     The stream to which to dump the object description.<br>
> +    //------------------------------------------------------------------<br>
>      bool<br>
>      GetDescription (lldb::SBStream &description);<br>
><br>
> @@ -63,10 +136,25 @@ public:<br>
>      // will only return valid values if the address has been resolved to a code<br>
>      // or data address using "void SBAddress::SetLoadAddress(...)" or<br>
>      // "lldb::SBAddress SBTarget::ResolveLoadAddress (...)".<br>
> +<br>
> +    //------------------------------------------------------------------<br>
> +    /// Lookup symbol information for this address.  An address might<br>
> +    /// refer to code or data from an existing module, or it might refer to<br>
> +    /// something on the stack or heap. This function will only return<br>
> +    /// valid values if the address has been resolved to a code or data<br>
> +    /// address using "void SBAddress::SetLoadAddress(...)" or<br>
> +    /// "lldb::SBAddress SBTarget::ResolveLoadAddress (...)".<br>
> +    ///<br>
> +    /// @param[in] resolve_scope<br>
> +    ///     lldb::SymbolContextItem value specifying the scope in which to<br>
> +    ///     resolve this address.<br>
> +    ///<br>
> +    /// @return<br>
> +    ///     lldb::SBSymbolContext with the result.<br>
> +    //------------------------------------------------------------------<br>
>      lldb::SBSymbolContext<br>
>      GetSymbolContext (uint32_t resolve_scope);<br>
><br>
> -<br>
>      // The following functions grab individual objects for a given address and<br>
>      // are less efficient if you want more than one symbol related objects.<br>
>      // Use one of the following when you want multiple debug symbol related<br>
> @@ -76,30 +164,67 @@ public:<br>
>      // One or more bits from the SymbolContextItem enumerations can be logically<br>
>      // OR'ed together to more efficiently retrieve multiple symbol objects.<br>
><br>
> +    //------------------------------------------------------------------<br>
> +    /// @return section<br>
> +    ///     The lldb::SBSection containing this address.<br>
> +    //------------------------------------------------------------------<br>
>      lldb::SBSection<br>
>      GetSection ();<br>
><br>
> +    //------------------------------------------------------------------<br>
> +    /// @return section<br>
> +    ///     The offset for this address, relative to the section.<br>
> +    //------------------------------------------------------------------<br>
>      lldb::addr_t<br>
>      GetOffset ();<br>
><br>
> +    //------------------------------------------------------------------<br>
> +    /// @return section<br>
> +    ///     The module containing this address.<br>
> +    //------------------------------------------------------------------<br>
>      lldb::SBModule<br>
>      GetModule ();<br>
><br>
> +    //------------------------------------------------------------------<br>
> +    /// @return section<br>
> +    ///     The compile unit containing this address.<br>
> +    //------------------------------------------------------------------<br>
>      lldb::SBCompileUnit<br>
>      GetCompileUnit ();<br>
><br>
> +    //------------------------------------------------------------------<br>
> +    /// @return section<br>
> +    ///     The function containing this address.<br>
> +    //------------------------------------------------------------------<br>
>      lldb::SBFunction<br>
>      GetFunction ();<br>
><br>
> +    //------------------------------------------------------------------<br>
> +    /// @return section<br>
> +    ///     The block containing this address.<br>
> +    //------------------------------------------------------------------<br>
>      lldb::SBBlock<br>
>      GetBlock ();<br>
><br>
> +    //------------------------------------------------------------------<br>
> +    /// @return section<br>
> +    ///     The symbol at this address.<br>
> +    //------------------------------------------------------------------<br>
>      lldb::SBSymbol<br>
>      GetSymbol ();<br>
><br>
> +    //------------------------------------------------------------------<br>
> +    /// @return section<br>
> +    ///     The lldb::SBLineEntry specifying the file location that<br>
> +    ///     corresponds to this address.<br>
> +    //------------------------------------------------------------------<br>
>      lldb::SBLineEntry<br>
>      GetLineEntry ();<br>
><br>
> +    //------------------------------------------------------------------<br>
> +    /// @return section<br>
> +    ///     The classification for this address.<br>
> +    //------------------------------------------------------------------<br>
>      lldb::AddressClass<br>
>      GetAddressClass ();<br>
><br>
><br>
</div></div>> _______________________________________________<br>
> lldb-commits mailing list<br>
> <a href="mailto:lldb-commits@lists.llvm.org">lldb-commits@lists.llvm.org</a><br>
> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits</a><br>
<br>
</blockquote></div><br></div>