Great!  Attached is the update.

On Thu, Mar 10, 2016 at 6:57 PM, Jim Ingham <jing...@apple.com> wrote:

> Few more comments...
>
> +/// If an address comes from an existing module, then it will be resolved
> +/// into an offset from its containing section in that module.  That way
> it
> +/// can refer to the same logical location as the module that holds it
> even
>
> Probably my error, but "location as the module" -> "location in the module"
>
> You use the terms "file virtual address" and "load virtual address".  I
> don't know what virtual means in that context.
>
>
> +    //------------------------------------------------------------------
> +    /// Tries to resolve the address within the target.  If this fails,
>
> "target" -> "target's modules"?  That makes it clearer what's going on.
>
> +    /// assumes the address is absolute, e.g., on the stack or heap.  The
> +    /// object becomes valid.
> +    ///
> +    /// @param[in] load_addr
> +    ///     A new offset value for this object.
>
> This isn't right, it isn't the new offset value, for instance if this is a
> load address from a loaded module,
> the SBAddress will be the containing section + offset, and load_addr !=
> SBAddress.GetOffset().  This is just the
> load address that will be resolved.
>
> +    ///
> +    /// @param[in] target
> +    ///     The target within which the offset is valid.
>
> "The target within which the load address will be resolved" is better.
> This will always return a valid SBAddress, it
> just might or might not be a section-relative one.
>
> +    //------------------------------------------------------------------
>      void
>      SetLoadAddress (lldb::addr_t load_addr,
>                      lldb::SBTarget &target);
>
> And "The target within which the offset is valid." -> "The target within
> which the load address will be resolved"?
>
>
> +    //------------------------------------------------------------------
> +    /// Set the offset for this address, relative to the current section,
> +    /// if any.
> +    ///
> +    /// @param[in] offset
> +    ///     A new offset value for this object.
> +    //------------------------------------------------------------------
> +    // FIXME:  Should this be SetOffsetAddress?
>      bool
>      OffsetAddress (addr_t offset);
>
> This call actually slides the SBAddress, so new_offset = old_offset +
> offset
>
>
> > On Mar 10, 2016, at 10:46 AM, John Lindal <git...@newplanetsoftware.com>
> wrote:
> >
> > Thanks for your patience and feedback!  Attached is the updated file.
> >
> > John
> >
> > On Wed, Mar 9, 2016 at 3:10 PM, Jim Ingham <jing...@apple.com> wrote:
> > The relation between section offsets and files is stronger than you are
> stating here.  You say:
> >
> > +/// Represents an address.  An address may refer to code or data from an
> > +/// existing module, or it may refer to something on the stack or heap.
> > +///
> >
> > That part is good, but you should use that in the next paragraph, so
> instead of:
> >
> > +/// If an address comes from a file on disk that has section relative
> > +/// addresses, then it has a virtual address that is relative to a
> unique
> > +/// section in the object file. Sections get resolved at runtime by
> > +/// DynamicLoader plug-ins as images (executables and shared libraries)
> get
> > +/// loaded/unloaded. If a section is loaded, then the load address can
> be
> > +/// resolved.
> >
> > Something like:
> >
> > If an address comes from an existing module, then it will be resolved
> into an offset
> > from its containing section in that module.  That way it can refer to
> the same logical
> > location as the module that holds it is unloaded and loaded at different
> addresses.
> > Module based SBAddresses are not bound to a particular target or
> process, but you
> > can ask the SBAddress where/if it has been loaded in a particular target.
> >
> > I don't think you need to mention the Dynamic loader plugin here, it
> isn't essential to know who tracks the
> > loads to understand what these do.  Also, you use "resolve" in the rest
> of the docs to mean "resolve to
> > section/offset in a Module.  So using it for loading libraries here is
> confusing.  Better to define it
> > here as you are going to use it.
> >
> > This bit doesn't seem right to me:
> >
> > -    // The following queries can lookup symbol information for a given
> address.
> > -    // An address might refer to code or data from an existing module,
> or it
> > -    // might refer to something on the stack or heap. The following
> functions
> > -    // will only return valid values if the address has been resolved
> to a code
> > -    // or data address using "void SBAddress::SetLoadAddress(...)" or
> > -    // "lldb::SBAddress SBTarget::ResolveLoadAddress (...)".
> > +    //------------------------------------------------------------------
> > +    /// Lookup symbol information for this address. This function will
> only
> > +    /// return a valid object if the address has been resolved to a
> code or
> > +    /// data address using "void SBAddress::SetLoadAddress(...)" or
> > +    /// "lldb::SBAddress SBTarget::ResolveLoadAddress (...)".
> > +    ///
> > +    /// @param[in] resolve_scope
> > +    ///     lldb::SymbolContextItem value specifying the scope in which
> to
> > +    ///     resolve this address.
> > +    ///
> > +    /// @return
> > +    ///     lldb::SBSymbolContext with the result.
> > +    //------------------------------------------------------------------
> >
> > You are faithfully representing the original docs, but they aren't
> right.  For instance, load a program that has a "main" symbol, but don't
> run it, then do:
> >
> > (lldb) script
> > >>> func = lldb.target.FindFunctions("main")
> > >>> print len(func)
> > 1
> > >>> func = func[0]
> > >>> addr = func.symbol.GetStartAddress()
> > >>> sc = addr.GetSymbolContext(lldb.eSymbolContextEverything)
> > >>> print sc.symbol
> > id = {0x000004df}, range = [0x0000000100018fa0-0x00000001000191f6),
> name="main"
> >
> > So that worked just fine even though there were no load addresses around
> anywhere.  ResolveSymbolContext needs an Address that can be
> > resolved to a Module, but that module doesn't need to be loaded...
> >
> > Also this bit:
> >
> > +    /// @param[in] resolve_scope
> > +    ///     lldb::SymbolContextItem value specifying the scope in which
> to
> > +    ///     resolve this address.
> > +    ///
> >
> > isn't quite right.  "The scope in which to resolve the address" makes it
> sound like this specifies some context you are using to resolve the address,
> > but it really determines how much information to fetch in the symbol
> context that the function returns.  There should be some general discussion
> of the
> > SymbolContextItem (maybe where we document FindFunctions?)  But in any
> case, here you can just "specifying how much information to fill in in the
> returned
> > SymbolContext.
> >
> > Jim
> >
> >
> >
> > > On Mar 9, 2016, at 2:24 PM, John Lindal <git...@newplanetsoftware.com>
> wrote:
> > >
> > > Here is a refinement of SBAddress.  The patch also includes updates to
> classes referenced by SBAddress.
> > >
> > > Does this read better?
> > >
> > > Thanks,
> > > John
> > >
> > > On Wed, Mar 9, 2016 at 11:56 AM, Jim Ingham <jing...@apple.com> wrote:
> > > 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.
> > >
> > > Thanks for starting this process!
> > >
> > > Jim
> > >
> > >
> > > > On Mar 9, 2016, at 11:47 AM, John Lindal via lldb-commits <
> lldb-commits@lists.llvm.org> wrote:
> > > >
> > > > 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 :)
> > > >
> > > > Here is a patch for SBAddress.h
> > > >
> > > > If this is the right direction, I will work my way through the rest
> of the SB*.h files.
> > > >
> > > > Thanks!
> > > > John Lindal
> > > >
> > > > -----
> > > >
> > > > diff --git a/include/lldb/API/SBAddress.h
> b/include/lldb/API/SBAddress.h
> > > > index 4cbbee9..b324e90 100644
> > > > --- a/include/lldb/API/SBAddress.h
> > > > +++ b/include/lldb/API/SBAddress.h
> > > > @@ -33,27 +33,100 @@ public:
> > > >      const lldb::SBAddress &
> > > >      operator = (const lldb::SBAddress &rhs);
> > > >
> > > > +
> //------------------------------------------------------------------
> > > > +    /// @return
> > > > +    ///     true if the object is valid.  If the object is invalid,
> it is
> > > > +    ///     not safe to call any other methods.
> > > > +
> //------------------------------------------------------------------
> > > >      bool
> > > >      IsValid () const;
> > > >
> > > > +
> //------------------------------------------------------------------
> > > > +    /// Clears the address.  The object is no longer valid.
> > > > +
> //------------------------------------------------------------------
> > > >      void
> > > >      Clear ();
> > > >
> > > > +
> //------------------------------------------------------------------
> > > > +    /// Get the file address.
> > > > +    ///
> > > > +    /// If an address comes from a file on disk that has section
> > > > +    /// relative addresses, then it has a virtual address that is
> > > > +    /// relative to a unique section in the object file.
> > > > +    ///
> > > > +    /// @return
> > > > +    ///     The valid file virtual address, or LLDB_INVALID_ADDRESS
> if
> > > > +    ///     the address doesn't have a file virtual address (image
> is
> > > > +    ///     from memory only with no representation on disk).
> > > > +
> //------------------------------------------------------------------
> > > >      addr_t
> > > >      GetFileAddress () const;
> > > >
> > > > +
> //------------------------------------------------------------------
> > > > +    /// Get the load address.
> > > > +    ///
> > > > +    /// If an address comes from a file on disk that has section
> > > > +    /// relative addresses, then it has a virtual address that is
> > > > +    /// relative to a unique section in the object file. Sections
> > > > +    /// get resolved at runtime by DynamicLoader plug-ins as images
> > > > +    /// (executables and shared libraries) get loaded/unloaded. If a
> > > > +    /// section is loaded, then the load address can be resolved.
> > > > +    ///
> > > > +    /// @param[in] target
> > > > +    ///     The target in which to search.
> > > > +    ///
> > > > +    /// @return
> > > > +    ///     The valid load virtual address, or LLDB_INVALID_ADDRESS
> if
> > > > +    ///     the address is currently not loaded.
> > > > +
> //------------------------------------------------------------------
> > > >      addr_t
> > > >      GetLoadAddress (const lldb::SBTarget &target) const;
> > > >
> > > > +
> //------------------------------------------------------------------
> > > > +    /// Set the section and address within the section.  If it
> succeeds,
> > > > +    /// the object becomes valid.
> > > > +    ///
> > > > +    /// @param[in] section
> > > > +    ///     A lldb::SBSection object to use as the section base.
> > > > +    ///
> > > > +    /// @param[in] offset
> > > > +    ///     A new offset value for this object.
> > > > +
> //------------------------------------------------------------------
> > > >      void
> > > >      SetAddress (lldb::SBSection section, lldb::addr_t offset);
> > > >
> > > > +
> //------------------------------------------------------------------
> > > > +    /// Tries to resolve the address within the target.  If this
> fails,
> > > > +    /// assumes the address is absolute, e.g., on the stack or
> heap.  If it
> > > > +    /// succeeds, the object becomes valid.
> > > > +    ///
> > > > +    /// @param[in] load_addr
> > > > +    ///     A new offset value for this object.
> > > > +    ///
> > > > +    /// @param[in] target
> > > > +    ///     The target within which the offset is valid.
> > > > +
> //------------------------------------------------------------------
> > > >      void
> > > >      SetLoadAddress (lldb::addr_t load_addr,
> > > >                      lldb::SBTarget &target);
> > > > +
> > > > +
> //------------------------------------------------------------------
> > > > +    /// Set the offset for this address, relative to the current
> section,
> > > > +    /// if any.
> > > > +    ///
> > > > +    /// @param[in] offset
> > > > +    ///     A new offset value for this object.
> > > > +
> //------------------------------------------------------------------
> > > > +    // FIXME:  Should this be SetOffsetAddress?
> > > >      bool
> > > >      OffsetAddress (addr_t offset);
> > > >
> > > > +
> //------------------------------------------------------------------
> > > > +    /// Dump a description of this object to the given
> lldb::SBStream.
> > > > +    ///
> > > > +    /// @param[in] description
> > > > +    ///     The stream to which to dump the object description.
> > > > +
> //------------------------------------------------------------------
> > > >      bool
> > > >      GetDescription (lldb::SBStream &description);
> > > >
> > > > @@ -63,10 +136,25 @@ public:
> > > >      // will only return valid values if the address has been
> resolved to a code
> > > >      // or data address using "void SBAddress::SetLoadAddress(...)"
> or
> > > >      // "lldb::SBAddress SBTarget::ResolveLoadAddress (...)".
> > > > +
> > > > +
> //------------------------------------------------------------------
> > > > +    /// Lookup symbol information for this address.  An address
> might
> > > > +    /// refer to code or data from an existing module, or it might
> refer to
> > > > +    /// something on the stack or heap. This function will only
> return
> > > > +    /// valid values if the address has been resolved to a code or
> data
> > > > +    /// address using "void SBAddress::SetLoadAddress(...)" or
> > > > +    /// "lldb::SBAddress SBTarget::ResolveLoadAddress (...)".
> > > > +    ///
> > > > +    /// @param[in] resolve_scope
> > > > +    ///     lldb::SymbolContextItem value specifying the scope in
> which to
> > > > +    ///     resolve this address.
> > > > +    ///
> > > > +    /// @return
> > > > +    ///     lldb::SBSymbolContext with the result.
> > > > +
> //------------------------------------------------------------------
> > > >      lldb::SBSymbolContext
> > > >      GetSymbolContext (uint32_t resolve_scope);
> > > >
> > > > -
> > > >      // The following functions grab individual objects for a given
> address and
> > > >      // are less efficient if you want more than one symbol related
> objects.
> > > >      // Use one of the following when you want multiple debug symbol
> related
> > > > @@ -76,30 +164,67 @@ public:
> > > >      // One or more bits from the SymbolContextItem enumerations can
> be logically
> > > >      // OR'ed together to more efficiently retrieve multiple symbol
> objects.
> > > >
> > > > +
> //------------------------------------------------------------------
> > > > +    /// @return section
> > > > +    ///     The lldb::SBSection containing this address.
> > > > +
> //------------------------------------------------------------------
> > > >      lldb::SBSection
> > > >      GetSection ();
> > > >
> > > > +
> //------------------------------------------------------------------
> > > > +    /// @return section
> > > > +    ///     The offset for this address, relative to the section.
> > > > +
> //------------------------------------------------------------------
> > > >      lldb::addr_t
> > > >      GetOffset ();
> > > >
> > > > +
> //------------------------------------------------------------------
> > > > +    /// @return section
> > > > +    ///     The module containing this address.
> > > > +
> //------------------------------------------------------------------
> > > >      lldb::SBModule
> > > >      GetModule ();
> > > >
> > > > +
> //------------------------------------------------------------------
> > > > +    /// @return section
> > > > +    ///     The compile unit containing this address.
> > > > +
> //------------------------------------------------------------------
> > > >      lldb::SBCompileUnit
> > > >      GetCompileUnit ();
> > > >
> > > > +
> //------------------------------------------------------------------
> > > > +    /// @return section
> > > > +    ///     The function containing this address.
> > > > +
> //------------------------------------------------------------------
> > > >      lldb::SBFunction
> > > >      GetFunction ();
> > > >
> > > > +
> //------------------------------------------------------------------
> > > > +    /// @return section
> > > > +    ///     The block containing this address.
> > > > +
> //------------------------------------------------------------------
> > > >      lldb::SBBlock
> > > >      GetBlock ();
> > > >
> > > > +
> //------------------------------------------------------------------
> > > > +    /// @return section
> > > > +    ///     The symbol at this address.
> > > > +
> //------------------------------------------------------------------
> > > >      lldb::SBSymbol
> > > >      GetSymbol ();
> > > >
> > > > +
> //------------------------------------------------------------------
> > > > +    /// @return section
> > > > +    ///     The lldb::SBLineEntry specifying the file location that
> > > > +    ///     corresponds to this address.
> > > > +
> //------------------------------------------------------------------
> > > >      lldb::SBLineEntry
> > > >      GetLineEntry ();
> > > >
> > > > +
> //------------------------------------------------------------------
> > > > +    /// @return section
> > > > +    ///     The classification for this address.
> > > > +
> //------------------------------------------------------------------
> > > >      lldb::AddressClass
> > > >      GetAddressClass ();
> > > >
> > > >
> > > > _______________________________________________
> > > > lldb-commits mailing list
> > > > lldb-commits@lists.llvm.org
> > > > http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
> > >
> > >
> > > <diff>
> >
> >
> > <diff>
>
>
//===-- SBAddress.h ---------------------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#ifndef LLDB_SBAddress_h_
#define LLDB_SBAddress_h_

#include "lldb/API/SBDefines.h"
#include "lldb/API/SBModule.h"

namespace lldb {

//------------------------------------------------------------------
/// \class SBAddress
///
/// Represents an address.  An address may refer to code or data from an
/// existing module, or it may refer to something on the stack or heap.
///
/// If an address comes from an existing module, then it will be resolved
/// into an offset from its containing section in that module.  That way it
/// can refer to the same logical location in the module that holds it even
/// if the module is unloaded and loaded at different addresses.  Module
/// based SBAddresses are not bound to a particular target or process, but
/// you can ask the SBAddress where/if it has been loaded in a particular
/// target.
///
/// The individual Get*() functions grab individual objects for a given
/// address and are less efficient if you want more than one symbol related
/// objects.  Use one of the following when you want multiple debug symbol
/// related objects for an address:
/// ~~~
/// * lldb::SBSymbolContext SBAddress::GetSymbolContext (uint32_t resolve_scope);
/// * lldb::SBSymbolContext SBTarget::ResolveSymbolContextForAddress (const SBAddress &addr, uint32_t resolve_scope);
/// ~~~
/// One or more bits from the SymbolContextItem enumerations can be
/// logically OR'ed together to more efficiently retrieve multiple symbol
/// objects.
//------------------------------------------------------------------
class LLDB_API SBAddress
{
public:

    SBAddress ();

    SBAddress (const lldb::SBAddress &rhs);

    SBAddress (lldb::SBSection section, lldb::addr_t offset);

    // Create an address by resolving a load address using the supplied target
    SBAddress (lldb::addr_t load_addr, lldb::SBTarget &target);

    ~SBAddress ();

    const lldb::SBAddress &
    operator = (const lldb::SBAddress &rhs);

    //------------------------------------------------------------------
    /// @return
    ///     true if the object is valid.  If the object is invalid, it is
    ///     not safe to call any other methods.
    //------------------------------------------------------------------
    bool
    IsValid () const;

    //------------------------------------------------------------------
    /// Clears the address.  The object is no longer valid.
    //------------------------------------------------------------------
    void
    Clear ();

    //------------------------------------------------------------------
    /// Get the file address.
    ///
    /// @return
    ///     The valid file address, or LLDB_INVALID_ADDRESS if the address
    ///     doesn't have a file address (image is from memory only with no
    ///     representation on disk).
    //------------------------------------------------------------------
    addr_t
    GetFileAddress () const;

    //------------------------------------------------------------------
    /// Get the load address.
    ///
    /// @param[in] target
    ///     The target in which to search.
    ///
    /// @return
    ///     The valid load address, or LLDB_INVALID_ADDRESS if the address
    ///     is currently not loaded.
    //------------------------------------------------------------------
    addr_t
    GetLoadAddress (const lldb::SBTarget &target) const;

    //------------------------------------------------------------------
    /// Set the section and address within the section.  If it succeeds,
    /// the object becomes valid.
    ///
    /// @param[in] section
    ///     A lldb::SBSection object to use as the section base.
    ///
    /// @param[in] offset
    ///     A new offset value for this object.
    //------------------------------------------------------------------
    void
    SetAddress (lldb::SBSection section, lldb::addr_t offset);

    //------------------------------------------------------------------
    /// Tries to resolve the address within the target's modules.  If this
    /// fails, assumes the address is absolute, e.g., on the stack or heap.
    /// The object becomes valid.
    ///
    /// @param[in] load_addr
    ///     A new load address for this object.
    ///
    /// @param[in] target
    ///     The target within which the load address will be resolved.
    //------------------------------------------------------------------
    void
    SetLoadAddress (lldb::addr_t load_addr, 
                    lldb::SBTarget &target);

    //------------------------------------------------------------------
    /// Shift the address relative to its current position.
    ///
    /// @param[in] offset
    ///     The offset by which the address should be shifted.
    //------------------------------------------------------------------
    bool
    OffsetAddress (addr_t offset);

    //------------------------------------------------------------------
    /// Dump a description of this object to the given lldb::SBStream.
    ///
    /// @param[in] description
    ///     The stream to which to dump the object description.
    //------------------------------------------------------------------
    bool
    GetDescription (lldb::SBStream &description);

    //------------------------------------------------------------------
    /// Lookup symbol information for this address.
    ///
    /// @param[in] resolve_scope
    ///     lldb::SymbolContextItem bitmap specifying what to retrieve.
    ///
    /// @return
    ///     lldb::SBSymbolContext with the result.
    //------------------------------------------------------------------
    lldb::SBSymbolContext
    GetSymbolContext (uint32_t resolve_scope);

    //------------------------------------------------------------------
    /// @return
    ///     The lldb::SBSection (within a module) containing this address.
    //------------------------------------------------------------------
    lldb::SBSection
    GetSection ();

    //------------------------------------------------------------------
    /// @return
    ///     The offset for this address, relative to the section.
    //------------------------------------------------------------------
    lldb::addr_t
    GetOffset ();

    //------------------------------------------------------------------
    /// @return
    ///     The lldb::SBModule containing this address.
    //------------------------------------------------------------------
    lldb::SBModule
    GetModule ();
    
    //------------------------------------------------------------------
    /// @return
    ///     The lldb::SBCompileUnit (within a module) containing this address.
    //------------------------------------------------------------------
    lldb::SBCompileUnit
    GetCompileUnit ();

    //------------------------------------------------------------------
    /// @return
    ///     The lldb::SBFunction containing this address.
    //------------------------------------------------------------------
    lldb::SBFunction
    GetFunction ();

    //------------------------------------------------------------------
    /// @return
    ///     The lldb::SBBlock containing this address.
    //------------------------------------------------------------------
    lldb::SBBlock
    GetBlock ();

    //------------------------------------------------------------------
    /// @return
    ///     The lldb::SBSymbol at this address.
    //------------------------------------------------------------------
    lldb::SBSymbol
    GetSymbol ();

    //------------------------------------------------------------------
    /// @return
    ///     The lldb::SBLineEntry specifying the file location that
    ///     corresponds to this address.
    //------------------------------------------------------------------
    lldb::SBLineEntry
    GetLineEntry ();
    
    //------------------------------------------------------------------
    /// @return
    ///     The classification for this address, e.g., code or data.
    //------------------------------------------------------------------
    lldb::AddressClass
    GetAddressClass ();

protected:

    friend class SBBlock;
    friend class SBBreakpointLocation;
    friend class SBFrame;
    friend class SBFunction;
    friend class SBLineEntry;
    friend class SBInstruction;
    friend class SBModule;
    friend class SBSection;
    friend class SBSymbol;
    friend class SBSymbolContext;
    friend class SBTarget;
    friend class SBThread;
    friend class SBThreadPlan;
    friend class SBValue;
    friend class SBQueueItem;

    lldb_private::Address *
    operator->();

    const lldb_private::Address *
    operator->() const;

    lldb_private::Address *
    get ();

    lldb_private::Address &
    ref();

    const lldb_private::Address &
    ref() const;

    SBAddress (const lldb_private::Address *lldb_object_ptr);

    void
    SetAddress (const lldb_private::Address *lldb_object_ptr);

private:

    std::unique_ptr<lldb_private::Address> m_opaque_ap;
};


} // namespace lldb

#endif // LLDB_SBAddress_h_
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to