[Lldb-commits] [lldb] r111706 - in /lldb/trunk: include/lldb/ include/lldb/Host/ include/lldb/Symbol/ lldb.xcodeproj/ source/Expression/ source/Host/macosx/ source/Plugins/Process/MacOSX-User/source/ source/Plugins/Process/gdb-remote/ source/Plugins/SymbolFile/DWARF/ source/Symbol/ source/Target/
Greg Clayton
gclayton at apple.com
Fri Aug 20 19:22:51 PDT 2010
Author: gclayton
Date: Fri Aug 20 21:22:51 2010
New Revision: 111706
URL: http://llvm.org/viewvc/llvm-project?rev=111706&view=rev
Log:
Modified the host process monitor callback function Host::StartMonitoringChildProcess
to spawn a thread for each process that is being monitored. Previously
LLDB would spawn a single thread that would wait for any child process which
isn't ok to do as a shared library (LLDB.framework on Mac OSX, or lldb.so on
linux). The old single thread used to call wait4() with a pid of -1 which
could cause it to reap child processes that it shouldn't have.
Re-wrote the way Function blocks are handles. Previously I attempted to keep
all blocks in a single memory allocation (in a std::vector). This made the
code somewhat efficient, but hard to work with. I got rid of the old BlockList
class, and went to a straight parent with children relationship. This new
approach will allow for partial parsing of the blocks within a function.
Modified:
lldb/trunk/include/lldb/Host/Host.h
lldb/trunk/include/lldb/Symbol/Block.h
lldb/trunk/include/lldb/Symbol/Function.h
lldb/trunk/include/lldb/lldb-forward.h
lldb/trunk/lldb.xcodeproj/project.pbxproj
lldb/trunk/source/Expression/ClangExpressionDeclMap.cpp
lldb/trunk/source/Host/macosx/Host.mm
lldb/trunk/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.cpp
lldb/trunk/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.h
lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h
lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
lldb/trunk/source/Symbol/Block.cpp
lldb/trunk/source/Symbol/Function.cpp
lldb/trunk/source/Symbol/SymbolContext.cpp
lldb/trunk/source/Symbol/Variable.cpp
lldb/trunk/source/Target/StackFrame.cpp
Modified: lldb/trunk/include/lldb/Host/Host.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Host/Host.h?rev=111706&r1=111705&r2=111706&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Host/Host.h (original)
+++ lldb/trunk/include/lldb/Host/Host.h Fri Aug 20 21:22:51 2010
@@ -66,34 +66,18 @@
/// get called if the child process exits.
///
/// @return
- /// A unique handle to the process monitoring information that
- /// can be used to stop monitoring a child process.
+ /// A thread handle that can be used to cancel the thread that
+ /// was spawned to monitor \a pid.
///
/// @see static void Host::StopMonitoringChildProcess (uint32_t)
//------------------------------------------------------------------
- static uint32_t
+ static lldb::thread_t
StartMonitoringChildProcess (MonitorChildProcessCallback callback,
void *callback_baton,
lldb::pid_t pid,
bool monitor_signals);
//------------------------------------------------------------------
- /// Stop monitoring a child process.
- ///
- /// @param[in] handle
- /// A unique handle returned from a previous call to
- /// Host::StartMonitoringChildProcess(...).
- ///
- /// @return
- /// \b true if the the handle was found and disabled, \b false
- /// if the monitor map with handle of \a handle was not found.
- ///
- /// @see static int Host::StartMonitoringChildProcess (MonitorChildProcessCallback *, void *, lldb::pid_t, bool)
- //------------------------------------------------------------------
- static bool
- StopMonitoringChildProcess (uint32_t handle);
-
- //------------------------------------------------------------------
/// Get the host page size.
///
/// @return
Modified: lldb/trunk/include/lldb/Symbol/Block.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/Block.h?rev=111706&r1=111705&r2=111706&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Symbol/Block.h (original)
+++ lldb/trunk/include/lldb/Symbol/Block.h Fri Aug 20 21:22:51 2010
@@ -43,17 +43,6 @@
public SymbolContextScope
{
public:
- friend class Function;
- friend class BlockList;
- //------------------------------------------------------------------
- /// Enumeration values for special and invalid Block User ID
- /// values.
- //------------------------------------------------------------------
- enum
- {
- RootID = LLDB_INVALID_UID - 1, ///< The Block UID for the root block
- InvalidID = LLDB_INVALID_UID ///< Invalid Block UID.
- };
//------------------------------------------------------------------
/// Construct with a User ID \a uid, \a depth.
@@ -79,17 +68,7 @@
///
/// @see BlockList
//------------------------------------------------------------------
- Block (lldb::user_id_t uid, uint32_t depth, BlockList* block_list);
-
- //------------------------------------------------------------------
- /// Copy constructor.
- ///
- /// Makes a copy of the another Block object \a rhs.
- ///
- /// @param[in] rhs
- /// A const Block object reference to copy.
- //------------------------------------------------------------------
- Block (const Block& rhs);
+ Block (lldb::user_id_t uid);
//------------------------------------------------------------------
/// Destructor.
@@ -97,37 +76,14 @@
~Block ();
//------------------------------------------------------------------
- /// Assignment operator.
- ///
- /// Copies the block value from another Block object \a rhs
- /// into \a this object.
- ///
- /// @param[in] rhs
- /// A const Block object reference to copy.
- ///
- /// @return
- /// A const Block object reference to \a this.
- //------------------------------------------------------------------
- const Block&
- operator= (const Block& rhs);
-
- //------------------------------------------------------------------
/// Add a child to this object.
///
- /// @param[in] uid
- /// The UID for a given block. This value is given by the
- /// SymbolFile plug-in and can be any value that helps the
- /// SymbolFile plug-in to match this block back to the debug
- /// information data that it parses for further or more in
- /// depth parsing. Common values would be the index into a
- /// table, or an offset into the debug information.
- ///
- /// @return
- /// Returns \a uid if the child was successfully added to this
- /// block, or Block::InvalidID on failure.
+ /// @param[in] child_block_sp
+ /// A shared pointer to a child block that will get added to
+ /// this block.
//------------------------------------------------------------------
- lldb::user_id_t
- AddChild (lldb::user_id_t uid);
+ void
+ AddChild (const lldb::BlockSP &child_block_sp);
//------------------------------------------------------------------
/// Add a new offset range to this block.
@@ -177,9 +133,6 @@
bool
Contains (const VMRange& range) const;
- bool
- ContainsBlockWithID (lldb::user_id_t block_id) const;
-
//------------------------------------------------------------------
/// Dump the block contents.
///
@@ -215,41 +168,11 @@
void
GetDescription (Stream *s,
+ Function *function,
lldb::DescriptionLevel level,
Process *process) const;
//------------------------------------------------------------------
- /// Get the parent block's UID.
- ///
- /// @return
- /// The UID of the parent block, or Block::InvalidID
- /// if this block has no parent.
- //------------------------------------------------------------------
- lldb::user_id_t
- GetParentUID () const;
-
- //------------------------------------------------------------------
- /// Get the sibling block's UID.
- ///
- /// @return
- /// The UID of the sibling block, or Block::InvalidID
- /// if this block has no sibling.
- //------------------------------------------------------------------
- lldb::user_id_t
- GetSiblingUID () const;
-
- //------------------------------------------------------------------
- /// Get the first child block's UID.
- ///
- /// @return
- /// The UID of the first child block, or Block::InvalidID
- /// if this block has no first child.
- //------------------------------------------------------------------
- lldb::user_id_t
- GetFirstChildUID () const;
-
-
- //------------------------------------------------------------------
/// Get the parent block.
///
/// @return
@@ -260,14 +183,17 @@
GetParent () const;
//------------------------------------------------------------------
- /// Get the sibling block.
+ /// Get the sibling block for this block.
///
/// @return
/// The sibling block pointer, or NULL if this block has no
/// sibling.
//------------------------------------------------------------------
Block *
- GetSibling () const;
+ GetSibling () const
+ {
+ return m_sibling;
+ }
//------------------------------------------------------------------
/// Get the first child block.
@@ -387,6 +313,19 @@
const Declaration *decl_ptr,
const Declaration *call_decl_ptr);
+
+ void
+ SetParentScope (SymbolContextScope *parent_scope)
+ {
+ m_parent_scope = parent_scope;
+ }
+
+ void
+ SetSibling (Block *block)
+ {
+ m_sibling = block;
+ }
+
//------------------------------------------------------------------
/// Set accessor for the variable list.
///
@@ -400,358 +339,39 @@
void
SetVariableList (lldb::VariableListSP& variable_list_sp);
-protected:
- //------------------------------------------------------------------
- /// Get accessor for the integer block depth value.
- ///
- /// @return
- /// The integer depth of this block in the block hiearchy.
- //------------------------------------------------------------------
- uint32_t Depth () const;
-
- //------------------------------------------------------------------
- // Member variables.
- //------------------------------------------------------------------
- BlockList *m_block_list; ///< The block list, one of which is this one
- uint32_t m_depth; ///< The depth of this block where zero is the root block
- VMRange::collection m_ranges; ///< A list of address offset ranges relative to the function's section/offset address.
- lldb::InlineFunctionInfoSP m_inlineInfoSP; ///< Inlined function information.
- lldb::VariableListSP m_variables; ///< The variable list for all local, static and paramter variables scoped to this block.
- // TOOD: add a Type* list
-};
-
-//----------------------------------------------------------------------
-/// @class BlockList Block.h "lldb/Symbol/Block.h"
-/// @brief A class that contains a heirachical collection of lexical
-/// block objects where one block is the root.
-///
-/// A collection of Block objects is managed by this class. All access
-/// to the block data is made through the block_uid of each block. This
-/// facilitates partial parsing and can enable block specific data to
-/// only be parsed when the data is asked for (variables, params, types,
-/// etc).
-//----------------------------------------------------------------------
-
-class BlockList
-{
-public:
- friend class Block;
- typedef std::vector<Block> collection;///< Our block collection type.
-
- //------------------------------------------------------------------
- /// Construct with \a function and section offset based address
- /// range.
- ///
- /// @param[in] function
- /// A const Function object that owns this block list.
- ///
- /// @param[in] range
- /// A section offset based address range object.
- //------------------------------------------------------------------
- BlockList (Function *function, const AddressRange& range);
-
- //------------------------------------------------------------------
- /// Destructor.
- //------------------------------------------------------------------
- ~BlockList ();
-
- //------------------------------------------------------------------
- /// Add a child block to a parent block.
- ///
- /// Adds a new child to a parent block. The UID values for
- /// blocks are created by the SymbolFile plug-ins and should have
- /// values that facilitate correlating an existing Block object
- /// with information in the debug information file. Typically
- /// a table index, or a debug information offset is used.
- ///
- /// @param[in] parent_uid
- /// The UID for a the existing parent block that will have
- /// a new child, whose UID is \a child_uid, added to its
- /// child list.
- ///
- /// @param[in] child_uid
- /// The UID for the new child block.
- ///
- /// @return
- /// Returns \a child_uid if the child was successfully added
- /// to the parent \a parent_uid, or Block::InvalidID on
- /// failure (if the parent doesn't exist).
- //------------------------------------------------------------------
- lldb::user_id_t
- AddChild (lldb::user_id_t parent_uid, lldb::user_id_t child_uid);
- //------------------------------------------------------------------
- /// Add a child block to a parent block.
- ///
- /// Adds a new child to a parent block. The UID values for
- /// blocks are created by the SymbolFile plug-ins and should have
- /// values that facilitate correlating an existing Block object
- /// with information in the debug information file. Typically
- /// a table index, or a debug information offset is used.
- ///
- /// @param[in] block_uid
- /// The UID for a the existing block that will get the
- /// new range.
- ///
- /// @param[in] start_offset
- /// An offset into this object's address range that
- /// describes the start address of a range for \a block_uid.
- ///
- /// @param[in] end_offset
- /// An offset into this object's address range that
- /// describes the end address of a range for for \a block_uid.
- ///
- /// @return
- /// Returns \b true if the range was successfully added to
- /// the block whose UID is \a block_uid, \b false otherwise.
- //------------------------------------------------------------------
bool
- AddRange (lldb::user_id_t block_uid, lldb::addr_t start_offset, lldb::addr_t end_offset);
-
-// const Block *
-// FindDeepestBlockForAddress (const Address &addr);
-
- //------------------------------------------------------------------
- /// Get accessor for the section offset based address range.
- ///
- /// All Block objects contained in a BlockList are relative to
- /// the base address in this object.
- ///
- /// @return
- /// Returns a reference to the section offset based address
- /// range object.
- //------------------------------------------------------------------
- AddressRange &
- GetAddressRange ();
-
- //------------------------------------------------------------------
- /// Get const accessor for the section offset based address range.
- ///
- /// All Block objects contained in a BlockList are relative to
- /// the base address in this object.
- ///
- /// @return
- /// Returns a const reference to the section offset based
- /// address range object.
- //------------------------------------------------------------------
- const AddressRange &
- GetAddressRange () const;
-
- //------------------------------------------------------------------
- /// Dump the block list contents.
- ///
- /// @param[in] s
- /// The stream to which to dump the object descripton.
- ///
- /// @param[in] block_uid
- /// The UID of the block in the block list to dump. If this
- /// value is Block::RootID, then the entire block list will
- /// dumped as long as \a depth is set to a large enough value.
- ///
- /// @param[in] depth
- /// Limit the number of levels deep that this function should
- /// print as the block whose UID is \a block_uid can contain
- /// child blocks. Specify INT_MAX to dump all child blocks.
- ///
- /// @param[in] show_context
- /// If \b true, variables will dump their context information.
- //------------------------------------------------------------------
+ BlockInfoHasBeenParsed() const
+ {
+ return m_parsed_block_info;
+ }
+
void
- Dump (Stream *s, lldb::user_id_t block_uid, uint32_t depth, bool show_context) const;
+ SetBlockInfoHasBeenParsed (bool b, bool set_children);
- //------------------------------------------------------------------
- /// Get a block object pointer by block UID.
- ///
- /// @param[in] block_uid
- /// The UID of the block to retrieve.
- ///
- /// @return
- /// A pointer to the block object, or NULL if \a block_uid
- /// doesn't exist in the block list.
- //------------------------------------------------------------------
Block *
- GetBlockByID (lldb::user_id_t block_uid);
-
- //------------------------------------------------------------------
- /// Get a const block object pointer by block UID.
- ///
- /// @param[in] block_uid
- /// The UID of the block to retrieve.
- ///
- /// @return
- /// A const pointer to the block object, or NULL if \a block_uid
- /// doesn't exist in the block list.
- //------------------------------------------------------------------
- const Block *
- GetBlockByID (lldb::user_id_t block_uid) const;
-
- //------------------------------------------------------------------
- /// Get a function object pointer for the block list.
- ///
- /// @return
- /// A pointer to the function object.
- //------------------------------------------------------------------
- Function *
- GetFunction ();
-
- //------------------------------------------------------------------
- /// Get a const function object pointer for the block list.
- ///
- /// @return
- /// A const pointer to the function object.
- //------------------------------------------------------------------
- const Function *
- GetFunction () const;
-
- //------------------------------------------------------------------
- /// Get the first child block UID for the block whose UID is \a
- /// block_uid.
- ///
- /// @param[in] block_uid
- /// The UID of the block we wish to access information for.
- ///
- /// @return
- /// The UID of the first child block, or Block::InvalidID
- /// if this block has no children, or if \a block_uid is not
- /// a valid block ID for this block list.
- //------------------------------------------------------------------
- lldb::user_id_t
- GetFirstChild (lldb::user_id_t block_uid) const;
-
- //------------------------------------------------------------------
- /// Get the parent block UID for the block whose UID is \a
- /// block_uid.
- ///
- /// @param[in] block_uid
- /// The UID of the block we wish to access information for.
- ///
- /// @return
- /// The UID of the parent block, or Block::InvalidID
- /// if this block has no parent, or if \a block_uid is not
- /// a valid block ID for this block list.
- //------------------------------------------------------------------
- lldb::user_id_t
- GetParent (lldb::user_id_t block_uid) const;
-
- //------------------------------------------------------------------
- /// Get the sibling block UID for the block whose UID is \a
- /// block_uid.
- ///
- /// @param[in] block_uid
- /// The UID of the block we wish to access information for.
- ///
- /// @return
- /// The UID of the sibling block, or Block::InvalidID
- /// if this block has no sibling, or if \a block_uid is not
- /// a valid block ID for this block list.
- //------------------------------------------------------------------
- lldb::user_id_t
- GetSibling (lldb::user_id_t block_uid) const;
-
- //------------------------------------------------------------------
- /// Get the variable list for the block whose UID is \a block_uid.
- ///
- /// @param[in] block_uid
- /// The UID of the block we wish to access information for.
- ///
- /// @param[in] can_create
- /// If \b true, the variable list can be parsed on demand. If
- /// \b false, the variable list contained in this object will
- /// be returned.
- ///
- /// @return
- /// The variable list shared pointer which may contain a NULL
- /// variable list object.
- //------------------------------------------------------------------
- lldb::VariableListSP
- GetVariableList (lldb::user_id_t block_uid, bool get_child_variables, bool can_create);
-
- //------------------------------------------------------------------
- /// Check if the block list is empty.
- ///
- /// @return
- /// Returns \b true if the block list is empty, \b false
- /// otherwise.
- //------------------------------------------------------------------
- bool
- IsEmpty () const;
-
- //------------------------------------------------------------------
- /// Get the memory cost of this object.
- ///
- /// Returns the cost of this object plus any owned objects (address
- /// range, and contains Block objects).
- ///
- /// @return
- /// The number of bytes that this object occupies in memory.
- //------------------------------------------------------------------
- size_t
- MemorySize () const;
-
- //------------------------------------------------------------------
- /// Set the variable list for the block whose UID is \a block_uid.
- ///
- /// @param[in] block_uid
- /// The UID of the block we wish to set information for.
- ///
- /// @param[in] variable_list_sp
- /// A shared pointer to list of variables.
- ///
- /// @return
- /// Returns \b true if the variable list was successfully added
- /// to the block, \b false otherwise.
- //------------------------------------------------------------------
- bool
- SetVariableList (lldb::user_id_t block_uid, lldb::VariableListSP& variable_list_sp);
-
- //------------------------------------------------------------------
- /// Set the inlined function info for the block whose UID is \a
- /// block_uid.
- ///
- /// @param[in] block_uid
- /// The UID of the block we wish to set information for.
- ///
- /// @param[in] name
- /// The method name for the inlined function. This value should
- /// not be NULL.
- ///
- /// @param[in] mangled
- /// The mangled method name for the inlined function. This can
- /// be NULL if there is no mangled name for an inlined function
- /// or if the name is the same as \a name.
- ///
- /// @param[in] decl_ptr
- /// A optional pointer to declaration information for the
- /// inlined function information. This value can be NULL to
- /// indicate that no declaration information is available.
- ///
- /// @param[in] call_decl_ptr
- /// Optional calling location declaration information that
- /// describes from where this inlined function was called.
- ///
- /// @return
- /// Returns \b true if the inline function info was successfully
- /// associated with the block, \b false otherwise.
- //------------------------------------------------------------------
- bool
- SetInlinedFunctionInfo (lldb::user_id_t block_uid, const char *name, const char *mangled, const Declaration *decl_ptr, const Declaration *call_decl_ptr);
+ FindBlockByID (lldb::user_id_t block_id);
protected:
+ typedef std::vector<lldb::BlockSP> collection;
//------------------------------------------------------------------
// Member variables.
//------------------------------------------------------------------
- Function *m_function; ///< A pointer to the function that owns this block list.
- AddressRange m_range; ///< The section offset based address range.
- collection m_blocks; ///< A contiguous array of block objects.
-
- bool
- BlockContainsBlockWithID (const lldb::user_id_t block_id, const lldb::user_id_t find_block_id) const;
+ SymbolContextScope *m_parent_scope;
+ Block *m_sibling;
+ collection m_children;
+ VMRange::collection m_ranges; ///< A list of address offset ranges relative to the function's section/offset address.
+ lldb::InlineFunctionInfoSP m_inlineInfoSP; ///< Inlined function information.
+ lldb::VariableListSP m_variables; ///< The variable list for all local, static and paramter variables scoped to this block.
+ bool m_parsed_block_info:1, ///< Set to true if this block and it's children have all been parsed
+ m_parsed_block_variables:1,
+ m_parsed_child_blocks:1;
private:
-
- DISALLOW_COPY_AND_ASSIGN (BlockList);
+ DISALLOW_COPY_AND_ASSIGN (Block);
};
+
} // namespace lldb_private
#endif // liblldb_Block_h_
Modified: lldb/trunk/include/lldb/Symbol/Function.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/Function.h?rev=111706&r1=111705&r2=111706&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Symbol/Function.h (original)
+++ lldb/trunk/include/lldb/Symbol/Function.h Fri Aug 20 21:22:51 2010
@@ -419,8 +419,11 @@
CalculateSymbolContext(SymbolContext* sc);
const AddressRange &
- GetAddressRange();
-
+ GetAddressRange()
+ {
+ return m_range;
+ }
+
//------------------------------------------------------------------
/// Find the file and line number of the source location of the start
/// of the function. This will use the declaration if present and fall
@@ -450,15 +453,6 @@
void
GetEndLineSourceInfo (FileSpec &source_file, uint32_t &line_no);
- //------------------------------------------------------------------
- /// Return whether this Function represents an inlined version of the
- /// original function.
- ///
- /// @return
- /// \b true if inlined, \b false otherwise.
- //------------------------------------------------------------------
- bool IsInlined();
-
//------------------------------------------------------------------
/// Get accessor for the block list.
///
@@ -468,8 +462,8 @@
///
/// @see BlockList
//------------------------------------------------------------------
- BlockList&
- GetBlocks (bool can_create);
+ Block&
+ GetBlock (bool can_create);
//------------------------------------------------------------------
/// Get accessor for the compile unit that owns this function.
@@ -611,14 +605,15 @@
//------------------------------------------------------------------
// Member variables.
//------------------------------------------------------------------
- CompileUnit *m_comp_unit; ///< The compile unit that owns this function.
+ CompileUnit *m_comp_unit; ///< The compile unit that owns this function.
lldb::user_id_t m_type_uid; ///< The user ID of for the prototype Type for this function.
- Type * m_type; ///< The function prototype type for this function that include the function info (FunctionInfo), return type and parameters.
- Mangled m_mangled; ///< The mangled function name if any, if empty, there is no mangled information.
- BlockList m_blocks; ///< All lexical blocks contained in this function.
+ Type * m_type; ///< The function prototype type for this function that include the function info (FunctionInfo), return type and parameters.
+ Mangled m_mangled; ///< The mangled function name if any, if empty, there is no mangled information.
+ Block m_block; ///< All lexical blocks contained in this function.
+ AddressRange m_range; ///< The function address range that covers the widest range needed to contain all blocks
DWARFExpression m_frame_base; ///< The frame base expression for variables that are relative to the frame pointer.
Flags m_flags;
- uint32_t m_prologue_byte_size; ///< Compute the prologue size once and cache it
+ uint32_t m_prologue_byte_size; ///< Compute the prologue size once and cache it
private:
DISALLOW_COPY_AND_ASSIGN(Function);
};
Modified: lldb/trunk/include/lldb/lldb-forward.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/lldb-forward.h?rev=111706&r1=111705&r2=111706&view=diff
==============================================================================
--- lldb/trunk/include/lldb/lldb-forward.h (original)
+++ lldb/trunk/include/lldb/lldb-forward.h Fri Aug 20 21:22:51 2010
@@ -25,7 +25,6 @@
class Args;
class Baton;
class Block;
-class BlockList;
class Breakpoint;
class BreakpointID;
class BreakpointIDList;
Modified: lldb/trunk/lldb.xcodeproj/project.pbxproj
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lldb.xcodeproj/project.pbxproj?rev=111706&r1=111705&r2=111706&view=diff
==============================================================================
--- lldb/trunk/lldb.xcodeproj/project.pbxproj (original)
+++ lldb/trunk/lldb.xcodeproj/project.pbxproj Fri Aug 20 21:22:51 2010
@@ -2791,6 +2791,7 @@
);
LLVM_BUILD_DIR = "$(SRCROOT)/llvm";
LLVM_CONFIGURATION = Release;
+ ONLY_ACTIVE_ARCH = NO;
OTHER_CFLAGS = (
"-DFOR_DYLD=0",
"-DSUPPORT_REMOTE_UNWINDING",
Modified: lldb/trunk/source/Expression/ClangExpressionDeclMap.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Expression/ClangExpressionDeclMap.cpp?rev=111706&r1=111705&r2=111706&view=diff
==============================================================================
--- lldb/trunk/source/Expression/ClangExpressionDeclMap.cpp (original)
+++ lldb/trunk/source/Expression/ClangExpressionDeclMap.cpp Fri Aug 20 21:22:51 2010
@@ -626,28 +626,21 @@
{
Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
- Function *function(m_sym_ctx->function);
- Block *block(m_sym_ctx->block);
-
- if (!function || !block)
+ if (m_sym_ctx->function == NULL || m_sym_ctx->block == NULL)
{
if (log)
- log->Printf("function = %p, block = %p", function, block);
+ log->Printf("function = %p, block = %p", m_sym_ctx->function, m_sym_ctx->block);
return NULL;
}
- BlockList& blocks(function->GetBlocks(true));
-
ConstString name_cs(name);
- lldb::user_id_t current_block_id;
+ Block *current_block;
- for (current_block_id = block->GetID();
- current_block_id != Block::InvalidID;
- current_block_id = blocks.GetParent(current_block_id))
- {
- Block *current_block(blocks.GetBlockByID(current_block_id));
-
+ for (current_block = m_sym_ctx->block;
+ current_block != NULL;
+ current_block = current_block->GetParent())
+ {
lldb::VariableListSP var_list = current_block->GetVariableList(false, true);
if (!var_list)
Modified: lldb/trunk/source/Host/macosx/Host.mm
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/macosx/Host.mm?rev=111706&r1=111705&r2=111706&view=diff
==============================================================================
--- lldb/trunk/source/Host/macosx/Host.mm (original)
+++ lldb/trunk/source/Host/macosx/Host.mm Fri Aug 20 21:22:51 2010
@@ -508,102 +508,48 @@
struct MonitorInfo
{
- uint32_t handle;
- pthread_t thread;
- Host::MonitorChildProcessCallback callback;
- void *callback_baton;
- bool monitor_signals;
+ lldb::pid_t pid; // The process ID to monitor
+ Host::MonitorChildProcessCallback callback; // The callback function to call when "pid" exits or signals
+ void *callback_baton; // The callback baton for the callback function
+ bool monitor_signals; // If true, call the callback when "pid" gets signaled.
};
-typedef std::multimap<lldb::pid_t, MonitorInfo> MonitorInfoMap;
-static pthread_mutex_t g_monitor_map_mutex = PTHREAD_MUTEX_INITIALIZER;
-typedef lldb::SharedPtr<MonitorInfoMap>::Type MonitorInfoMapSP;
-
-static MonitorInfoMapSP&
-GetMonitorMap (bool can_create)
-{
- static MonitorInfoMapSP g_monitor_map_sp;
- if (can_create && g_monitor_map_sp.get() == NULL)
- {
- g_monitor_map_sp.reset (new MonitorInfoMap);
- }
- return g_monitor_map_sp;
-}
-
-static Predicate<bool>&
-GetChildProcessPredicate ()
-{
- static Predicate<bool> g_has_child_processes;
- return g_has_child_processes;
-}
-
static void *
MonitorChildProcessThreadFunction (void *arg);
-static pthread_t g_monitor_thread;
-
-uint32_t
+lldb::thread_t
Host::StartMonitoringChildProcess
(
- MonitorChildProcessCallback callback,
+ Host::MonitorChildProcessCallback callback,
void *callback_baton,
lldb::pid_t pid,
bool monitor_signals
)
{
- static uint32_t g_handle = 0;
+
+ lldb::thread_t thread = LLDB_INVALID_HOST_THREAD;
if (callback)
{
- Mutex::Locker locker(&g_monitor_map_mutex);
- if (!g_monitor_thread)
- {
- lldb::pid_t wait_pid = -1;
- g_monitor_thread = ThreadCreate ("<lldb.host.wait4>",
- MonitorChildProcessThreadFunction,
- &wait_pid,
- NULL);
- if (g_monitor_thread)
- {
- //Host::ThreadDetach (g_monitor_thread, NULL);
- }
- }
-
- if (g_monitor_thread)
- {
- MonitorInfo info = { ++g_handle, 0, callback, callback_baton, monitor_signals };
- MonitorInfoMapSP monitor_map_sp (GetMonitorMap (true));
- if (monitor_map_sp)
- {
- monitor_map_sp->insert(std::make_pair(pid, info));
- GetChildProcessPredicate ().SetValue (true, eBroadcastOnChange);
- return info.handle;
- }
- }
- }
- return 0;
-}
-
-bool
-Host::StopMonitoringChildProcess (uint32_t handle)
-{
- Mutex::Locker locker(&g_monitor_map_mutex);
- MonitorInfoMapSP monitor_map_sp (GetMonitorMap (false));
- if (monitor_map_sp)
- {
- MonitorInfoMap::iterator pos, end = monitor_map_sp->end();
- for (pos = monitor_map_sp->end(); pos != end; ++pos)
- {
- if (pos->second.handle == handle)
- {
- monitor_map_sp->erase(pos);
- return true;
- }
- }
+ std::auto_ptr<MonitorInfo> info_ap(new MonitorInfo);
+
+ info_ap->pid = pid;
+ info_ap->callback = callback;
+ info_ap->callback_baton = callback_baton;
+ info_ap->monitor_signals = monitor_signals;
+
+ char thread_name[256];
+ ::snprintf (thread_name, sizeof(thread_name), "<lldb.host.wait4(pid=%i)>", pid);
+ thread = ThreadCreate (thread_name,
+ MonitorChildProcessThreadFunction,
+ info_ap.get(),
+ NULL);
+
+ if (thread != LLDB_INVALID_HOST_THREAD)
+ info_ap.release();
}
- return false;
+ return thread;
}
-
//------------------------------------------------------------------
// Scoped class that will disable thread canceling when it is
// constructed, and exception safely restore the previous value it
@@ -643,64 +589,37 @@
if (log)
log->Printf ("%s (arg = %p) thread starting...", function, arg);
- const lldb::pid_t wait_pid = -1;//*((pid_t*)arg);
+ MonitorInfo *info = (MonitorInfo *)arg;
+
+ const Host::MonitorChildProcessCallback callback = info->callback;
+ void * const callback_baton = info->callback_baton;
+ const lldb::pid_t pid = info->pid;
+ const bool monitor_signals = info->monitor_signals;
+
+ delete info;
+
int status = -1;
const int options = 0;
struct rusage *rusage = NULL;
while (1)
{
if (log)
- log->Printf("%s ::wait4 (pid = %i, &status, options = %i, rusage = %p)...", function, wait_pid, options, rusage);
+ log->Printf("%s ::wait4 (pid = %i, &status, options = %i, rusage = %p)...", function, pid, options, rusage);
// Wait for all child processes
::pthread_testcancel ();
- lldb::pid_t pid = ::wait4 (wait_pid, &status, options, rusage);
+ const lldb::pid_t wait_pid = ::wait4 (pid, &status, options, rusage);
::pthread_testcancel ();
- if (pid < 0)
+ if (wait_pid == -1)
{
- // No child processes to watch wait for the mutex to be cleared
-
- // Scope for "locker"
- {
- ScopedPThreadCancelDisabler pthread_cancel_disabler;
-
- // First clear out all monitor entries since we have no processes
- // to watch.
- Mutex::Locker locker(&g_monitor_map_mutex);
- // Since we don't have any child processes, we can safely clear
- // anyone with a valid pid.
- MonitorInfoMapSP monitor_map_sp(GetMonitorMap (false));
- if (monitor_map_sp)
- {
- MonitorInfoMap::iterator pos = monitor_map_sp->begin();
- while (pos != monitor_map_sp->end())
- {
- // pid value of 0 and -1 are special (see man page on wait4...)
- if (pos->first > 0)
- {
- MonitorInfoMap::iterator next_pos = pos; ++next_pos;
- monitor_map_sp->erase (pos, next_pos);
- pos = next_pos;
- }
- else
- ++pos;
- }
- }
- }
-
- if (log)
- log->Printf("%s no child processes, wait for some...", function);
- GetChildProcessPredicate ().SetValue (false, eBroadcastNever);
- ::pthread_testcancel();
- GetChildProcessPredicate ().WaitForValueEqualTo (true);
- if (log)
- log->Printf("%s resuming monitoring of child processes.", function);
-
+ if (errno == EINTR)
+ continue;
+ else
+ break;
}
- else
+ else if (wait_pid == pid)
{
- ScopedPThreadCancelDisabler pthread_cancel_disabler;
bool exited = false;
int signal = 0;
int exit_status = 0;
@@ -728,80 +647,47 @@
status_cstr = "(???)";
}
- if (log)
- log->Printf ("%s ::wait4 (pid = %i, &status, options = %i, rusage = %p) => pid = %i, status = 0x%8.8x (%s), signal = %i, exit_state = %i",
- function,
- wait_pid,
- options,
- rusage,
- pid,
- status,
- status_cstr,
- signal,
- exit_status);
-
- // Scope for mutex locker
+ // Scope for pthread_cancel_disabler
{
- // Notify anyone listening to this process
- Mutex::Locker locker(&g_monitor_map_mutex);
- MonitorInfoMapSP monitor_map_sp(GetMonitorMap (false));
- if (monitor_map_sp)
+ ScopedPThreadCancelDisabler pthread_cancel_disabler;
+
+ if (log)
+ log->Printf ("%s ::wait4 (pid = %i, &status, options = %i, rusage = %p) => pid = %i, status = 0x%8.8x (%s), signal = %i, exit_state = %i",
+ function,
+ wait_pid,
+ options,
+ rusage,
+ pid,
+ status,
+ status_cstr,
+ signal,
+ exit_status);
+
+ if (exited || (signal != 0 && monitor_signals))
{
- std::pair<MonitorInfoMap::iterator, MonitorInfoMap::iterator> range;
- range = monitor_map_sp->equal_range(pid);
- MonitorInfoMap::iterator pos;
- for (pos = range.first; pos != range.second; ++pos)
- {
- if (exited || (signal != 0 && pos->second.monitor_signals))
- {
- bool callback_return = pos->second.callback (pos->second.callback_baton, pid, signal, exit_status);
-
- if (exited || callback_return)
- {
- // Make this entry as needing to be removed by
- // setting its handle to zero
- pos->second.handle = 0;
- }
- }
- }
-
- // Remove any entries that requested to be removed or any
- // entries for child processes that did exit. We know this
- // because we changed the handles to an invalid value.
- pos = monitor_map_sp->begin();
- while (pos != monitor_map_sp->end())
- {
- if (pos->second.handle == 0)
- {
- MonitorInfoMap::iterator next_pos = pos; ++next_pos;
- monitor_map_sp->erase (pos, next_pos);
- pos = next_pos;
- }
- else
- ++pos;
- }
+ bool callback_return = callback (callback_baton, pid, signal, exit_status);
+
+ // If our process exited, then this thread should exit
+ if (exited)
+ break;
+ // If the callback returns true, it means this process should
+ // exit
+ if (callback_return)
+ break;
}
}
}
}
if (log)
- log->Printf ("ProcessMacOSX::%s (arg = %p) thread exiting...", __FUNCTION__, arg);
+ log->Printf ("%s (arg = %p) thread exiting...", __FUNCTION__, arg);
- g_monitor_thread = NULL;
return NULL;
}
void
Host::WillTerminate ()
{
- if (g_monitor_thread != NULL)
- {
- ThreadCancel (g_monitor_thread, NULL);
- GetChildProcessPredicate ().SetValue (true, eBroadcastAlways);
- ThreadJoin(g_monitor_thread, NULL, NULL);
- g_monitor_thread = NULL;
- }
}
uint32_t
Modified: lldb/trunk/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.cpp?rev=111706&r1=111705&r2=111706&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.cpp (original)
+++ lldb/trunk/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.cpp Fri Aug 20 21:22:51 2010
@@ -226,6 +226,7 @@
m_task (this),
m_flags (eFlagsNone),
m_stdio_thread (LLDB_INVALID_HOST_THREAD),
+ m_monitor_thread (LLDB_INVALID_HOST_THREAD),
m_stdio_mutex (Mutex::eMutexTypeRecursive),
m_stdout_data (),
m_exception_messages (),
@@ -244,6 +245,7 @@
{
// m_mach_process.UnregisterNotificationCallbacks (this);
Clear();
+
}
//----------------------------------------------------------------------
@@ -450,7 +452,7 @@
// Install a signal handler so we can catch when our child process
// dies and set the exit status correctly.
- Host::StartMonitoringChildProcess (Process::SetProcessExitStatus, NULL, GetID(), false);
+ m_monitor_thread = Host::StartMonitoringChildProcess (Process::SetProcessExitStatus, NULL, GetID(), false);
if (m_arch_spec == ArchSpec("arm"))
{
@@ -1156,6 +1158,14 @@
m_exception_messages.clear();
}
+ if (m_monitor_thread != LLDB_INVALID_HOST_THREAD)
+ {
+ Host::ThreadCancel (m_monitor_thread, NULL);
+ thread_result_t thread_result;
+ Host::ThreadJoin (m_monitor_thread, &thread_result, NULL);
+ m_monitor_thread = LLDB_INVALID_HOST_THREAD;
+ }
+
}
bool
Modified: lldb/trunk/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.h?rev=111706&r1=111705&r2=111706&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.h (original)
+++ lldb/trunk/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.h Fri Aug 20 21:22:51 2010
@@ -239,6 +239,7 @@
MachTask m_task; // The mach task for this process
lldb_private::Flags m_flags; // Process specific flags (see eFlags enums)
lldb::thread_t m_stdio_thread; // Thread ID for the thread that watches for child process stdio
+ lldb::thread_t m_monitor_thread; // Thread ID for the thread that watches for child process stdio
lldb_private::Mutex m_stdio_mutex; // Multithreaded protection for stdio
std::string m_stdout_data;
MachException::Message::collection m_exception_messages; // A collection of exception messages caught when listening to the exception port
Modified: lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp?rev=111706&r1=111705&r2=111706&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp (original)
+++ lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp Fri Aug 20 21:22:51 2010
@@ -110,7 +110,7 @@
m_byte_order (eByteOrderHost),
m_gdb_comm(),
m_debugserver_pid (LLDB_INVALID_PROCESS_ID),
- m_debugserver_monitor (0),
+ m_debugserver_thread (LLDB_INVALID_HOST_THREAD),
m_last_stop_packet (),
m_register_info (),
m_async_broadcaster ("lldb.process.gdb-remote.async-broadcaster"),
@@ -134,6 +134,13 @@
//----------------------------------------------------------------------
ProcessGDBRemote::~ProcessGDBRemote()
{
+ if (m_debugserver_thread != LLDB_INVALID_HOST_THREAD)
+ {
+ Host::ThreadCancel (m_debugserver_thread, NULL);
+ thread_result_t thread_result;
+ Host::ThreadJoin (m_debugserver_thread, &thread_result, NULL);
+ m_debugserver_thread = LLDB_INVALID_HOST_THREAD;
+ }
// m_mach_process.UnregisterNotificationCallbacks (this);
Clear();
}
@@ -535,11 +542,11 @@
m_gdb_comm.SendAck('+');
if (m_debugserver_pid != LLDB_INVALID_PROCESS_ID)
- m_debugserver_monitor = Host::StartMonitoringChildProcess (MonitorDebugserverProcess,
- (void*)(intptr_t)GetID(), // Pass the inferior pid in the thread argument (which is a void *)
- m_debugserver_pid,
- false);
-
+ m_debugserver_thread = Host::StartMonitoringChildProcess (MonitorDebugserverProcess,
+ this,
+ m_debugserver_pid,
+ false);
+
StringExtractorGDBRemote response;
if (m_gdb_comm.SendPacketAndWaitForResponse("QStartNoAckMode", response, 1, false))
{
@@ -1907,47 +1914,42 @@
// "debugserver_pid" argument passed in is the process ID for
// debugserver that we are tracking...
- lldb::pid_t gdb_remote_pid = (lldb::pid_t)(intptr_t)callback_baton;
- TargetSP target_sp(Debugger::FindTargetWithProcessID (gdb_remote_pid));
- if (target_sp)
- {
- ProcessSP process_sp (target_sp->GetProcessSP());
- if (process_sp)
- {
- // Sleep for a half a second to make sure our inferior process has
- // time to set its exit status before we set it incorrectly when
- // both the debugserver and the inferior process shut down.
- usleep (500000);
- // If our process hasn't yet exited, debugserver might have died.
- // If the process did exit, the we are reaping it.
- if (process_sp->GetState() != eStateExited)
- {
- char error_str[1024];
- if (signo)
- {
- const char *signal_cstr = process_sp->GetUnixSignals().GetSignalAsCString (signo);
- if (signal_cstr)
- ::snprintf (error_str, sizeof (error_str), DEBUGSERVER_BASENAME " died with signal %s", signal_cstr);
- else
- ::snprintf (error_str, sizeof (error_str), DEBUGSERVER_BASENAME " died with signal %i", signo);
- }
+ ProcessGDBRemote *process = (ProcessGDBRemote *)callback_baton;
+
+ if (process)
+ {
+ // Sleep for a half a second to make sure our inferior process has
+ // time to set its exit status before we set it incorrectly when
+ // both the debugserver and the inferior process shut down.
+ usleep (500000);
+ // If our process hasn't yet exited, debugserver might have died.
+ // If the process did exit, the we are reaping it.
+ if (process->GetState() != eStateExited)
+ {
+ char error_str[1024];
+ if (signo)
+ {
+ const char *signal_cstr = process->GetUnixSignals().GetSignalAsCString (signo);
+ if (signal_cstr)
+ ::snprintf (error_str, sizeof (error_str), DEBUGSERVER_BASENAME " died with signal %s", signal_cstr);
else
- {
- ::snprintf (error_str, sizeof (error_str), DEBUGSERVER_BASENAME " died with an exit status of 0x%8.8x", exit_status);
- }
-
- process_sp->SetExitStatus (-1, error_str);
+ ::snprintf (error_str, sizeof (error_str), DEBUGSERVER_BASENAME " died with signal %i", signo);
}
else
{
- ProcessGDBRemote *gdb_process = (ProcessGDBRemote *)process_sp.get();
- // Debugserver has exited we need to let our ProcessGDBRemote
- // know that it no longer has a debugserver instance
- gdb_process->m_debugserver_pid = LLDB_INVALID_PROCESS_ID;
- // We are returning true to this function below, so we can
- // forget about the monitor handle.
- gdb_process->m_debugserver_monitor = 0;
+ ::snprintf (error_str, sizeof (error_str), DEBUGSERVER_BASENAME " died with an exit status of 0x%8.8x", exit_status);
}
+
+ process->SetExitStatus (-1, error_str);
+ }
+ else
+ {
+ // Debugserver has exited we need to let our ProcessGDBRemote
+ // know that it no longer has a debugserver instance
+ process->m_debugserver_pid = LLDB_INVALID_PROCESS_ID;
+ // We are returning true to this function below, so we can
+ // forget about the monitor handle.
+ process->m_debugserver_thread = LLDB_INVALID_HOST_THREAD;
}
}
return true;
Modified: lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h?rev=111706&r1=111705&r2=111706&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h (original)
+++ lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h Fri Aug 20 21:22:51 2010
@@ -324,7 +324,7 @@
lldb::ByteOrder m_byte_order;
GDBRemoteCommunication m_gdb_comm;
lldb::pid_t m_debugserver_pid;
- uint32_t m_debugserver_monitor;
+ lldb::thread_t m_debugserver_thread;
StringExtractor m_last_stop_packet;
GDBRemoteDynamicRegisterInfo m_register_info;
lldb_private::Broadcaster m_async_broadcaster;
Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp?rev=111706&r1=111705&r2=111706&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp Fri Aug 20 21:22:51 2010
@@ -785,8 +785,7 @@
static void
AddRangesToBlock
(
- BlockList& blocks,
- lldb::user_id_t blockID,
+ Block& block,
DWARFDebugRanges::RangeList& ranges,
addr_t block_base_addr
)
@@ -796,7 +795,7 @@
const DWARFDebugRanges::Range *debug_range;
for (range_idx = 0; (debug_range = ranges.RangeAtIndex(range_idx)) != NULL; range_idx++)
{
- blocks.AddRange(blockID, debug_range->begin_offset, debug_range->end_offset);
+ block.AddRange(debug_range->begin_offset, debug_range->end_offset);
}
}
@@ -1129,7 +1128,7 @@
SymbolFileDWARF::ParseFunctionBlocks
(
const SymbolContext& sc,
- lldb::user_id_t parentBlockID,
+ Block *parent_block,
const DWARFCompileUnit* dwarf_cu,
const DWARFDebugInfoEntry *die,
addr_t subprogram_low_pc,
@@ -1151,18 +1150,31 @@
DWARFDebugRanges::RangeList ranges;
const char *name = NULL;
const char *mangled_name = NULL;
- BlockList& blocks = sc.function->GetBlocks(false);
+ Block *block = NULL;
+ if (tag != DW_TAG_subprogram)
+ {
+ BlockSP block_sp(new Block (die->GetOffset()));
+ parent_block->AddChild(block_sp);
+ block = block_sp.get();
+ }
+ else
+ {
+ block = parent_block;
+ }
- lldb::user_id_t blockID = blocks.AddChild(parentBlockID, die->GetOffset());
int decl_file = 0;
int decl_line = 0;
int decl_column = 0;
int call_file = 0;
int call_line = 0;
int call_column = 0;
- if (die->GetDIENamesAndRanges(this, dwarf_cu, name, mangled_name, ranges,
- decl_file, decl_line, decl_column,
- call_file, call_line, call_column))
+ if (die->GetDIENamesAndRanges (this,
+ dwarf_cu,
+ name,
+ mangled_name,
+ ranges,
+ decl_file, decl_line, decl_column,
+ call_file, call_line, call_column))
{
if (tag == DW_TAG_subprogram)
{
@@ -1185,7 +1197,7 @@
}
}
- AddRangesToBlock (blocks, blockID, ranges, subprogram_low_pc);
+ AddRangesToBlock (*block, ranges, subprogram_low_pc);
if (tag != DW_TAG_subprogram && (name != NULL || mangled_name != NULL))
{
@@ -1199,15 +1211,20 @@
call_ap.reset(new Declaration(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(call_file),
call_line, call_column));
- blocks.SetInlinedFunctionInfo(blockID, name, mangled_name, decl_ap.get(), call_ap.get());
+ block->SetInlinedFunctionInfo (name, mangled_name, decl_ap.get(), call_ap.get());
}
++blocks_added;
if (parse_children && die->HasChildren())
{
- blocks_added += ParseFunctionBlocks(sc, blockID, dwarf_cu, die->GetFirstChild(),
- subprogram_low_pc, true, true);
+ blocks_added += ParseFunctionBlocks (sc,
+ block,
+ dwarf_cu,
+ die->GetFirstChild(),
+ subprogram_low_pc,
+ true,
+ true);
}
}
}
@@ -1582,12 +1599,12 @@
if (resolve_scope & eSymbolContextBlock)
{
- BlockList& blocks = sc.function->GetBlocks(true);
+ Block& block = sc.function->GetBlock (true);
if (block_die != NULL)
- sc.block = blocks.GetBlockByID(block_die->GetOffset());
+ sc.block = block.FindBlockByID (block_die->GetOffset());
else
- sc.block = blocks.GetBlockByID(function_die->GetOffset());
+ sc.block = block.FindBlockByID (function_die->GetOffset());
if (sc.block)
resolved |= eSymbolContextBlock;
}
@@ -1674,12 +1691,12 @@
if (sc.function != NULL)
{
- BlockList& blocks = sc.function->GetBlocks(true);
+ Block& block = sc.function->GetBlock (true);
if (block_die != NULL)
- sc.block = blocks.GetBlockByID(block_die->GetOffset());
+ sc.block = block.FindBlockByID (block_die->GetOffset());
else
- sc.block = blocks.GetBlockByID(function_die->GetOffset());
+ sc.block = block.FindBlockByID (function_die->GetOffset());
}
}
}
@@ -3126,7 +3143,7 @@
}
else if (sc.function != NULL)
{
- symbol_context_scope = sc.function->GetBlocks(true).GetBlockByID(sc_parent_die->GetOffset());
+ symbol_context_scope = sc.function->GetBlock(true).FindBlockByID(sc_parent_die->GetOffset());
if (symbol_context_scope == NULL)
symbol_context_scope = sc.function;
}
@@ -3235,7 +3252,7 @@
const DWARFDebugInfoEntry *function_die = dwarf_cu->GetDIEPtr(function_die_offset);
if (function_die)
{
- ParseFunctionBlocks(sc, Block::RootID, dwarf_cu, function_die, LLDB_INVALID_ADDRESS, false, true);
+ ParseFunctionBlocks(sc, &sc.function->GetBlock (false), dwarf_cu, function_die, LLDB_INVALID_ADDRESS, false, true);
}
}
@@ -3430,7 +3447,7 @@
}
else if (sc.function != NULL)
{
- symbol_context_scope = sc.function->GetBlocks(true).GetBlockByID(sc_parent_die->GetOffset());
+ symbol_context_scope = sc.function->GetBlock(true).FindBlockByID(sc_parent_die->GetOffset());
if (symbol_context_scope == NULL)
symbol_context_scope = sc.function;
}
@@ -3495,11 +3512,14 @@
if (sc.function != NULL)
{
// Check to see if we already have parsed the variables for the given scope
- variables = sc.function->GetBlocks(true).GetVariableList(sc_parent_die->GetOffset(), false, false);
+
+ Block *block = sc.function->GetBlock(true).FindBlockByID(sc_parent_die->GetOffset());
+ assert (block != NULL);
+ variables = block->GetVariableList(false, true);
if (variables.get() == NULL)
{
variables.reset(new VariableList());
- sc.function->GetBlocks(true).SetVariableList(sc_parent_die->GetOffset(), variables);
+ block->SetVariableList(variables);
}
}
else
Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h?rev=111706&r1=111705&r2=111706&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h Fri Aug 20 21:22:51 2010
@@ -222,7 +222,7 @@
bool GetFunction (DWARFCompileUnit* cu, const DWARFDebugInfoEntry* func_die, lldb_private::SymbolContext& sc);
lldb_private::Function * ParseCompileUnitFunction (const lldb_private::SymbolContext& sc, const DWARFCompileUnit* dwarf_cu, const DWARFDebugInfoEntry *die);
size_t ParseFunctionBlocks (const lldb_private::SymbolContext& sc,
- lldb::user_id_t parentBlockID,
+ lldb_private::Block *parent_block,
const DWARFCompileUnit* dwarf_cu,
const DWARFDebugInfoEntry *die,
lldb::addr_t subprogram_low_pc,
Modified: lldb/trunk/source/Symbol/Block.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/Block.cpp?rev=111706&r1=111705&r2=111706&view=diff
==============================================================================
--- lldb/trunk/source/Symbol/Block.cpp (original)
+++ lldb/trunk/source/Symbol/Block.cpp Fri Aug 20 21:22:51 2010
@@ -17,47 +17,26 @@
using namespace lldb;
using namespace lldb_private;
-Block::Block(user_id_t uid, uint32_t depth, BlockList* blocks) :
+Block::Block(lldb::user_id_t uid) :
UserID(uid),
- m_block_list(blocks),
- m_depth(depth),
- m_ranges(),
- m_inlineInfoSP(),
- m_variables()
+ m_parent_scope (NULL),
+ m_sibling (NULL),
+ m_children (),
+ m_ranges (),
+ m_inlineInfoSP (),
+ m_variables (),
+ m_parsed_block_info (false),
+ m_parsed_block_variables (false),
+ m_parsed_child_blocks (false)
{
}
-Block::Block(const Block& rhs) :
- UserID(rhs),
- m_block_list(rhs.m_block_list),
- m_depth(rhs.m_depth),
- m_ranges(rhs.m_ranges),
- m_inlineInfoSP(rhs.m_inlineInfoSP),
- m_variables(rhs.m_variables)
-{
-}
-
-const Block&
-Block::operator= (const Block& rhs)
-{
- if (this != &rhs)
- {
- UserID::operator= (rhs);
- m_block_list = rhs.m_block_list;
- m_depth = rhs.m_depth;
- m_ranges = rhs.m_ranges;
- m_inlineInfoSP = rhs.m_inlineInfoSP;
- m_variables = rhs.m_variables;
- }
- return *this;
-}
-
Block::~Block ()
{
}
void
-Block::GetDescription(Stream *s, lldb::DescriptionLevel level, Process *process) const
+Block::GetDescription(Stream *s, Function *function, lldb::DescriptionLevel level, Process *process) const
{
size_t num_ranges = m_ranges.size();
if (num_ranges)
@@ -65,9 +44,9 @@
addr_t base_addr = LLDB_INVALID_ADDRESS;
if (process)
- base_addr = m_block_list->GetAddressRange().GetBaseAddress().GetLoadAddress(process);
+ base_addr = function->GetAddressRange().GetBaseAddress().GetLoadAddress(process);
if (base_addr == LLDB_INVALID_ADDRESS)
- base_addr = m_block_list->GetAddressRange().GetBaseAddress().GetFileAddress();
+ base_addr = function->GetAddressRange().GetBaseAddress().GetFileAddress();
s->Printf("range%s = ", num_ranges > 1 ? "s" : "");
std::vector<VMRange>::const_iterator pos, end = m_ranges.end();
@@ -85,9 +64,13 @@
{
if (depth < 0)
{
- // We have a depth that is less than zero, print our parent blocks
- // first
- m_block_list->Dump(s, GetParentUID(), depth + 1, show_context);
+ Block *parent = GetParent();
+ if (parent)
+ {
+ // We have a depth that is less than zero, print our parent blocks
+ // first
+ parent->Dump(s, base_addr, depth + 1, show_context);
+ }
}
s->Printf("%.*p: ", (int)sizeof(void*) * 2, this);
@@ -126,12 +109,9 @@
m_variables->Dump(s, show_context);
}
- uint32_t blockID = m_block_list->GetFirstChild(GetID());
- while (blockID != Block::InvalidID)
+ for (Block *child_block = GetFirstChild(); child_block != NULL; child_block = child_block->GetSibling())
{
- m_block_list->Dump(s, blockID, depth - 1, show_context);
-
- blockID = m_block_list->GetSibling(blockID);
+ child_block->Dump(s, base_addr, depth - 1, show_context);
}
s->IndentLess();
@@ -140,11 +120,28 @@
}
+Block *
+Block::FindBlockByID (user_id_t block_id)
+{
+ if (block_id == GetID())
+ return this;
+
+ Block *matching_block = NULL;
+ for (Block *child_block = GetFirstChild(); child_block != NULL; child_block = child_block->GetSibling())
+ {
+ matching_block = child_block->FindBlockByID (block_id);
+ if (matching_block)
+ break;
+ }
+ return matching_block;
+}
+
void
Block::CalculateSymbolContext(SymbolContext* sc)
{
+ if (m_parent_scope)
+ m_parent_scope->CalculateSymbolContext(sc);
sc->block = this;
- m_block_list->GetFunction()->CalculateSymbolContext(sc);
}
void
@@ -196,7 +193,10 @@
void
Block::DumpSymbolContext(Stream *s)
{
- m_block_list->GetFunction()->DumpSymbolContext(s);
+ SymbolContext sc;
+ CalculateSymbolContext(&sc);
+ if (sc.function)
+ sc.function->DumpSymbolContext(s);
s->Printf(", Block{0x%8.8x}", GetID());
}
@@ -212,37 +212,19 @@
return VMRange::ContainsRange(m_ranges, range);
}
-
-
-bool
-BlockList::BlockContainsBlockWithID (const user_id_t block_id, const user_id_t find_block_id) const
+Block *
+Block::GetParent () const
{
- if (block_id == Block::InvalidID)
- return false;
-
- if (block_id == find_block_id)
- return true;
- else
+ if (m_parent_scope)
{
- user_id_t child_block_id = GetFirstChild(block_id);
- while (child_block_id != Block::InvalidID)
- {
- if (BlockContainsBlockWithID (child_block_id, find_block_id))
- return true;
- child_block_id = GetSibling(child_block_id);
- }
+ SymbolContext sc;
+ m_parent_scope->CalculateSymbolContext(&sc);
+ if (sc.block)
+ return sc.block;
}
-
- return false;
-}
-
-bool
-Block::ContainsBlockWithID (user_id_t block_id) const
-{
- return m_block_list->BlockContainsBlockWithID (GetID(), block_id);
+ return NULL;
}
-
void
Block::AddRange(addr_t start_offset, addr_t end_offset)
{
@@ -276,45 +258,29 @@
}
Block *
-Block::GetParent () const
-{
- return m_block_list->GetBlockByID (m_block_list->GetParent(GetID()));
-}
-
-Block *
-Block::GetSibling () const
-{
- return m_block_list->GetBlockByID (m_block_list->GetSibling(GetID()));
-}
-
-Block *
Block::GetFirstChild () const
{
- return m_block_list->GetBlockByID (m_block_list->GetFirstChild(GetID()));
+ if (m_children.empty())
+ return NULL;
+ return m_children.front().get();
}
-user_id_t
-Block::GetParentUID() const
+void
+Block::AddChild(const BlockSP &child_block_sp)
{
- return m_block_list->GetParent(GetID());
-}
+ if (child_block_sp)
+ {
+ Block *block_needs_sibling = NULL;
-user_id_t
-Block::GetSiblingUID() const
-{
- return m_block_list->GetSibling(GetID());
-}
+ if (!m_children.empty())
+ block_needs_sibling = m_children.back().get();
-user_id_t
-Block::GetFirstChildUID() const
-{
- return m_block_list->GetFirstChild(GetID());
-}
+ child_block_sp->SetParentScope (this);
+ m_children.push_back (child_block_sp);
-user_id_t
-Block::AddChild(user_id_t userID)
-{
- return m_block_list->AddChild(GetID(), userID);
+ if (block_needs_sibling)
+ block_needs_sibling->SetSibling (child_block_sp.get());
+ }
}
void
@@ -329,12 +295,16 @@
Block::GetVariableList (bool get_child_variables, bool can_create)
{
VariableListSP variable_list_sp;
- if (m_variables.get() == NULL && can_create)
+ if (m_parsed_block_variables == false)
{
- SymbolContext sc;
- CalculateSymbolContext(&sc);
- assert(sc.module_sp);
- sc.module_sp->GetSymbolVendor()->ParseVariablesForContext(sc);
+ if (m_variables.get() == NULL && can_create)
+ {
+ m_parsed_block_variables = true;
+ SymbolContext sc;
+ CalculateSymbolContext(&sc);
+ assert(sc.module_sp);
+ sc.module_sp->GetSymbolVendor()->ParseVariablesForContext(sc);
+ }
}
if (m_variables.get())
@@ -387,285 +357,14 @@
m_variables = variables;
}
-uint32_t
-Block::Depth () const
-{
- return m_depth;
-}
-
-BlockList::BlockList(Function *function, const AddressRange& range) :
- m_function(function),
- m_range(range),
- m_blocks()
-{
-}
-
-BlockList::~BlockList()
-{
-}
-
-AddressRange &
-BlockList::GetAddressRange()
-{
- return m_range;
-}
-
-const AddressRange &
-BlockList::GetAddressRange() const
-{
- return m_range;
-}
-
void
-BlockList::Dump(Stream *s, user_id_t blockID, uint32_t depth, bool show_context) const
-{
- const Block* block = GetBlockByID(blockID);
- if (block)
- block->Dump(s, m_range.GetBaseAddress().GetFileAddress(), depth, show_context);
-}
-
-Function *
-BlockList::GetFunction()
-{
- return m_function;
-}
-
-
-const Function *
-BlockList::GetFunction() const
-{
- return m_function;
-}
-
-user_id_t
-BlockList::GetParent(user_id_t blockID) const
+Block::SetBlockInfoHasBeenParsed (bool b, bool set_children)
{
- collection::const_iterator end = m_blocks.end();
- collection::const_iterator begin = m_blocks.begin();
- collection::const_iterator pos = std::find_if(begin, end, UserID::IDMatches(blockID));
-
- if (pos != end && pos != begin && pos->Depth() > 0)
+ m_parsed_block_info = b;
+ if (set_children)
{
- const uint32_t parent_depth = pos->Depth() - 1;
-
- while (--pos >= begin)
- {
- if (pos->Depth() == parent_depth)
- return pos->GetID();
- }
+ m_parsed_child_blocks = true;
+ for (Block *child_block = GetFirstChild(); child_block != NULL; child_block = child_block->GetSibling())
+ child_block->SetBlockInfoHasBeenParsed (b, true);
}
- return Block::InvalidID;
-}
-
-user_id_t
-BlockList::GetSibling(user_id_t blockID) const
-{
- collection::const_iterator end = m_blocks.end();
- collection::const_iterator pos = std::find_if(m_blocks.begin(), end, UserID::IDMatches(blockID));
-
- if (pos != end)
- {
- const uint32_t sibling_depth = pos->Depth();
- while (++pos != end)
- {
- uint32_t depth = pos->Depth();
- if (depth == sibling_depth)
- return pos->GetID();
- if (depth < sibling_depth)
- break;
- }
- }
- return Block::InvalidID;
-}
-
-user_id_t
-BlockList::GetFirstChild(user_id_t blockID) const
-{
- if (!m_blocks.empty())
- {
- if (blockID == Block::RootID)
- {
- return m_blocks.front().GetID();
- }
- else
- {
- collection::const_iterator end = m_blocks.end();
- collection::const_iterator pos = std::find_if(m_blocks.begin(), end, UserID::IDMatches(blockID));
-
- if (pos != end)
- {
- collection::const_iterator child_pos = pos + 1;
- if (child_pos != end)
- {
- if (child_pos->Depth() == pos->Depth() + 1)
- return child_pos->GetID();
- }
- }
- }
- }
- return Block::InvalidID;
-}
-
-
-// Return the current number of bytes that this object occupies in memory
-size_t
-BlockList::MemorySize() const
-{
- size_t mem_size = sizeof(BlockList);
-
- collection::const_iterator pos, end = m_blocks.end();
- for (pos = m_blocks.begin(); pos != end; ++pos)
- mem_size += pos->MemorySize(); // Each block can vary in size
-
- return mem_size;
-
-}
-
-user_id_t
-BlockList::AddChild (user_id_t parentID, user_id_t childID)
-{
- bool added = false;
- if (parentID == Block::RootID)
- {
- assert(m_blocks.empty());
- Block block(childID, 0, this);
- m_blocks.push_back(block);
- added = true;
- }
- else
- {
- collection::iterator end = m_blocks.end();
- collection::iterator parent_pos = std::find_if(m_blocks.begin(), end, UserID::IDMatches(parentID));
- assert(parent_pos != end);
- if (parent_pos != end)
- {
- const uint32_t parent_sibling_depth = parent_pos->Depth();
-
- collection::iterator insert_pos = parent_pos;
- collection::iterator prev_sibling = end;
- while (++insert_pos != end)
- {
- if (insert_pos->Depth() <= parent_sibling_depth)
- break;
- }
-
- Block child_block(childID, parent_pos->Depth() + 1, this);
- collection::iterator child_pos = m_blocks.insert(insert_pos, child_block);
- added = true;
- }
- }
- if (added)
- return childID;
- return Block::InvalidID;
-}
-
-const Block *
-BlockList::GetBlockByID(user_id_t blockID) const
-{
- if (m_blocks.empty() || blockID == Block::InvalidID)
- return NULL;
-
- if (blockID == Block::RootID)
- blockID = m_blocks.front().GetID();
-
- collection::const_iterator end = m_blocks.end();
- collection::const_iterator pos = std::find_if(m_blocks.begin(), end, UserID::IDMatches(blockID));
- if (pos != end)
- return &(*pos);
- return NULL;
-}
-
-Block *
-BlockList::GetBlockByID(user_id_t blockID)
-{
- if (m_blocks.empty() || blockID == Block::InvalidID)
- return NULL;
-
- if (blockID == Block::RootID)
- blockID = m_blocks.front().GetID();
-
- collection::iterator end = m_blocks.end();
- collection::iterator pos = std::find_if(m_blocks.begin(), end, UserID::IDMatches(blockID));
- if (pos != end)
- return &(*pos);
- return NULL;
-}
-
-bool
-BlockList::AddRange(user_id_t blockID, addr_t start_offset, addr_t end_offset)
-{
- Block *block = GetBlockByID(blockID);
-
- if (block)
- {
- block->AddRange(start_offset, end_offset);
- return true;
- }
- return false;
-}
-//
-//const Block *
-//BlockList::FindDeepestBlockForAddress (const Address &addr)
-//{
-// if (m_range.Contains(addr))
-// {
-// addr_t block_offset = addr.GetFileAddress() - m_range.GetBaseAddress().GetFileAddress();
-// collection::const_iterator pos, end = m_blocks.end();
-// collection::const_iterator deepest_match_pos = end;
-// for (pos = m_blocks.begin(); pos != end; ++pos)
-// {
-// if (pos->Contains (block_offset))
-// {
-// if (deepest_match_pos == end || deepest_match_pos->Depth() < pos->Depth())
-// deepest_match_pos = pos;
-// }
-// }
-// if (deepest_match_pos != end)
-// return &(*deepest_match_pos);
-// }
-// return NULL;
-//}
-//
-bool
-BlockList::SetInlinedFunctionInfo(user_id_t blockID, const char *name, const char *mangled, const Declaration *decl_ptr, const Declaration *call_decl_ptr)
-{
- Block *block = GetBlockByID(blockID);
-
- if (block)
- {
- block->SetInlinedFunctionInfo(name, mangled, decl_ptr, call_decl_ptr);
- return true;
- }
- return false;
-}
-
-VariableListSP
-BlockList::GetVariableList(user_id_t blockID, bool get_child_variables, bool can_create)
-{
- VariableListSP variable_list_sp;
- Block *block = GetBlockByID(blockID);
- if (block)
- variable_list_sp = block->GetVariableList(get_child_variables, can_create);
- return variable_list_sp;
-}
-
-bool
-BlockList::IsEmpty() const
-{
- return m_blocks.empty();
-}
-
-
-
-bool
-BlockList::SetVariableList(user_id_t blockID, VariableListSP& variables)
-{
- Block *block = GetBlockByID(blockID);
- if (block)
- {
- block->SetVariableList(variables);
- return true;
- }
- return false;
-
}
Modified: lldb/trunk/source/Symbol/Function.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/Function.cpp?rev=111706&r1=111705&r2=111706&view=diff
==============================================================================
--- lldb/trunk/source/Symbol/Function.cpp (original)
+++ lldb/trunk/source/Symbol/Function.cpp Fri Aug 20 21:22:51 2010
@@ -191,16 +191,18 @@
Type * type,
const AddressRange& range
) :
- UserID(func_uid),
- m_comp_unit(comp_unit),
- m_type_uid(type_uid),
- m_type(type),
- m_mangled(mangled),
- m_blocks(this, range),
- m_frame_base(),
- m_flags(),
- m_prologue_byte_size(0)
+ UserID (func_uid),
+ m_comp_unit (comp_unit),
+ m_type_uid (type_uid),
+ m_type (type),
+ m_mangled (mangled),
+ m_block (func_uid),
+ m_range (range),
+ m_frame_base (),
+ m_flags (),
+ m_prologue_byte_size (0)
{
+ m_block.SetParentScope(this);
assert(comp_unit != NULL);
}
@@ -213,16 +215,18 @@
Type *type,
const AddressRange &range
) :
- UserID(func_uid),
- m_comp_unit(comp_unit),
- m_type_uid(type_uid),
- m_type(type),
- m_mangled(mangled, true),
- m_blocks(this, range),
- m_frame_base(),
- m_flags(),
- m_prologue_byte_size(0)
+ UserID (func_uid),
+ m_comp_unit (comp_unit),
+ m_type_uid (type_uid),
+ m_type (type),
+ m_mangled (mangled, true),
+ m_block (func_uid),
+ m_range (range),
+ m_frame_base (),
+ m_flags (),
+ m_prologue_byte_size (0)
{
+ m_block.SetParentScope(this);
assert(comp_unit != NULL);
}
@@ -231,24 +235,6 @@
{
}
-const AddressRange &
-Function::GetAddressRange()
-{
- return GetBlocks(true).GetAddressRange();
-}
-
-bool
-Function::IsInlined()
-{
- Block *root_block = GetBlocks(true).GetBlockByID(Block::RootID);
- if (root_block)
- {
- if (root_block->InlinedFunctionInfo() != NULL)
- return true;
- }
- return false;
-
-}
void
Function::GetStartLineSourceInfo (FileSpec &source_file, uint32_t &line_no)
{
@@ -301,17 +287,18 @@
}
}
-BlockList &
-Function::GetBlocks(bool can_create)
+Block &
+Function::GetBlock (bool can_create)
{
- if (m_blocks.IsEmpty() && can_create)
+ if (!m_block.BlockInfoHasBeenParsed() && can_create)
{
SymbolContext sc;
CalculateSymbolContext(&sc);
assert(sc.module_sp);
sc.module_sp->GetSymbolVendor()->ParseFunctionBlocks(sc);
+ m_block.SetBlockInfoHasBeenParsed (true, true);
}
- return m_blocks;
+ return m_block;
}
CompileUnit*
@@ -358,8 +345,8 @@
s->EOL();
// Dump the root object
- if (!m_blocks.IsEmpty())
- m_blocks.Dump(s, Block::RootID, INT_MAX, show_context);
+ if (m_block.BlockInfoHasBeenParsed ())
+ m_block.Dump(s, m_range.GetBaseAddress().GetFileAddress(), INT_MAX, show_context);
}
@@ -380,7 +367,7 @@
size_t
Function::MemorySize () const
{
- size_t mem_size = sizeof(Function) + m_blocks.MemorySize();
+ size_t mem_size = sizeof(Function) + m_block.MemorySize();
return mem_size;
}
Modified: lldb/trunk/source/Symbol/SymbolContext.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/SymbolContext.cpp?rev=111706&r1=111705&r2=111706&view=diff
==============================================================================
--- lldb/trunk/source/Symbol/SymbolContext.cpp (original)
+++ lldb/trunk/source/Symbol/SymbolContext.cpp Fri Aug 20 21:22:51 2010
@@ -217,7 +217,7 @@
s->Indent(" Blocks: ");
else
s->Indent(" ");
- (*pos)->GetDescription(s, level, process);
+ (*pos)->GetDescription(s, function, level, process);
s->EOL();
}
}
Modified: lldb/trunk/source/Symbol/Variable.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/Variable.cpp?rev=111706&r1=111705&r2=111706&view=diff
==============================================================================
--- lldb/trunk/source/Symbol/Variable.cpp (original)
+++ lldb/trunk/source/Symbol/Variable.cpp Fri Aug 20 21:22:51 2010
@@ -154,7 +154,7 @@
SymbolContext variable_sc;
CalculateSymbolContext (&variable_sc);
if (variable_sc.function && variable_sc.block)
- return variable_sc.block->ContainsBlockWithID (frame_block->GetID());
+ return variable_sc.block->FindBlockByID(frame_block->GetID()) != NULL;
}
}
break;
Modified: lldb/trunk/source/Target/StackFrame.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/StackFrame.cpp?rev=111706&r1=111705&r2=111706&view=diff
==============================================================================
--- lldb/trunk/source/Target/StackFrame.cpp (original)
+++ lldb/trunk/source/Target/StackFrame.cpp Fri Aug 20 21:22:51 2010
@@ -280,7 +280,7 @@
{
bool get_child_variables = true;
bool can_create = true;
- m_variable_list_sp = m_sc.function->GetBlocks(can_create).GetVariableList (Block::RootID, get_child_variables, can_create);
+ m_variable_list_sp = m_sc.function->GetBlock (can_create).GetVariableList (get_child_variables, can_create);
}
}
return m_variable_list_sp.get();
More information about the lldb-commits
mailing list