Function.h revision 24943d2ee8bfaa7cf5893e4709143924157a5c1e
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Function.h ----------------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#ifndef liblldb_Function_h_
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define liblldb_Function_h_
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/AddressRange.h"
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Block.h"
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Declaration.h"
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Expression/DWARFExpression.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Mangled.h"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/UserID.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private {
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// @class FunctionInfo Function.h "lldb/Symbol/Function.h"
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// @brief A class that contains generic function information.
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// This provides generic function information that gets resused between
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// inline functions and function types.
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass FunctionInfo
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Construct with the function method name and optional declaration
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// information.
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] name
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A C string name for the method name for this function. This
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     value should not be the mangled named, but the simple method
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     name.
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] decl_ptr
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     Optional declaration information that describes where the
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     function was declared. This can be NULL.
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    FunctionInfo (const char *name, const Declaration *decl_ptr);
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Construct with the function method name and optional declaration
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// information.
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] name
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A name for the method name for this function. This value
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     should not be the mangled named, but the simple method name.
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] decl_ptr
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     Optional declaration information that describes where the
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     function was declared. This can be NULL.
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    FunctionInfo (const ConstString& name, const Declaration *decl_ptr);
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Destructor.
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// The destructor is virtual since classes inherit from this class.
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~FunctionInfo ();
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Compare two function information objects.
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// First compares the method names, and if equal, then compares
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// the declaration information.
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] lhs
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The Left Hand Side const FunctionInfo object reference.
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] rhs
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The Right Hand Side const FunctionInfo object reference.
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     @li -1 if lhs < rhs
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     @li 0 if lhs == rhs
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     @li 1 if lhs > rhs
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static int
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Compare (const FunctionInfo& lhs, const FunctionInfo& rhs);
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Dump a description of this object to a Stream.
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Dump a description of the contents of this object to the
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// supplied stream \a s.
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] s
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The stream to which to dump the object descripton.
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Dump (Stream *s) const;
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Get accessor for the declaration information.
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A reference to the declaration object.
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Declaration&
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetDeclaration ();
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Get const accessor for the declaration information.
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A const reference to the declaration object.
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Declaration&
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetDeclaration () const;
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Get accessor for the method name.
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A const reference to the method name object.
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const ConstString&
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetName () const;
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Get the memory cost of this object.
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The number of bytes that this object occupies in memory.
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The returned value does not include the bytes for any
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     shared string values.
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @see ConstString::StaticMemorySize ()
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual size_t
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    MemorySize () const;
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Member variables.
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ConstString m_name; ///< Function method name (not a mangled name).
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Declaration m_declaration; ///< Information describing where this function information was defined.
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// @class InlineFunctionInfo Function.h "lldb/Symbol/Function.h"
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// @brief A class that describes information for an inlined function.
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass InlineFunctionInfo : public FunctionInfo
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Construct with the function method name, mangled name, and
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// optional declaration information.
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] name
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A C string name for the method name for this function. This
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     value should not be the mangled named, but the simple method
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     name.
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] mangled
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A C string name for the mangled name for this function. This
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     value can be NULL if there is no mangled information.
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] decl_ptr
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     Optional declaration information that describes where the
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     function was declared. This can be NULL.
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] call_decl_ptr
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     Optional calling location declaration information that
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     describes from where this inlined function was called.
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    InlineFunctionInfo(const char *name, const char *mangled, const Declaration *decl_ptr, const Declaration *call_decl_ptr);
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Construct with the function method name, mangled name, and
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// optional declaration information.
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] name
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A name for the method name for this function. This value
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     should not be the mangled named, but the simple method name.
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] mangled
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A name for the mangled name for this function. This value
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     can be empty if there is no mangled information.
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] decl_ptr
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     Optional declaration information that describes where the
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     function was declared. This can be NULL.
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] call_decl_ptr
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     Optional calling location declaration information that
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     describes from where this inlined function was called.
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    InlineFunctionInfo(const ConstString& name, const Mangled &mangled, const Declaration *decl_ptr, const Declaration *call_decl_ptr);
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Destructor.
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~InlineFunctionInfo();
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Compare two inlined function information objects.
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// First compares the FunctionInfo objects, and if equal,
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// compares the mangled names.
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] lhs
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The Left Hand Side const InlineFunctionInfo object
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     reference.
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] rhs
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The Right Hand Side const InlineFunctionInfo object
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     reference.
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     @li -1 if lhs < rhs
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     @li 0 if lhs == rhs
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     @li 1 if lhs > rhs
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Compare(const InlineFunctionInfo& lhs, const InlineFunctionInfo& rhs);
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Dump a description of this object to a Stream.
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Dump a description of the contents of this object to the
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// supplied stream \a s.
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] s
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The stream to which to dump the object descripton.
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Dump(Stream *s) const;
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DumpStopContext (Stream *s) const;
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Get accessor for the call site declaration information.
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A reference to the declaration object.
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Declaration&
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetCallSite ();
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Get const accessor for the call site declaration information.
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A const reference to the declaration object.
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Declaration&
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetCallSite () const;
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Get accessor for the mangled name object.
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A reference to the mangled name object.
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mangled&
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetMangled();
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Get const accessor for the mangled name object.
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A const reference to the mangled name object.
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Mangled&
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetMangled() const;
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Get the memory cost of this object.
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The number of bytes that this object occupies in memory.
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The returned value does not include the bytes for any
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     shared string values.
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @see ConstString::StaticMemorySize ()
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual size_t
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    MemorySize() const;
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate:
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Member variables.
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mangled m_mangled; ///< Mangled inlined function name (can be empty if there is no mangled information).
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Declaration m_call_decl;
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// @class Function Function.h "lldb/Symbol/Function.h"
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// @brief A class that describes a function.
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// Functions belong to CompileUnit objects (Function::m_comp_unit),
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// have unique user IDs (Function::UserID), know how to reconstruct
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// their symbol context (Function::SymbolContextScope), have a
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// specific function type (Function::m_type_uid), have a simple
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// method name (FunctionInfo::m_name), be declared at a specific
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// location (FunctionInfo::m_declaration), possibly have mangled
31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// names (Function::m_mangled), an optional return type
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// (Function::m_type), and contains lexical blocks
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// (Function::m_blocks).
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// The function inforation is split into a few pieces:
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///     @li The concrete instance information
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///     @li The abstract information
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// The abstract information is found in the function type (Type) that
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// describes a function information, return type and parameter types.
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// The concreate information is the address range information and
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// specific locations for an instance of this function.
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass Function :
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    public UserID,
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    public SymbolContextScope
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Construct with a compile unit, function UID, function type UID,
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// optional mangled name, function type, and a section offset
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// based address range.
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] comp_unit
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The compile unit to which this function belongs.
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] func_uid
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The UID for this function. This value is provided by the
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     SymbolFile plug-in and can be any value that allows
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     the plug-in to quickly find and parse more detailed
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     information when and if more information is needed.
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] func_type_uid
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The type UID for the function Type to allow for lazy type
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     parsing from the debug information.
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] mangled
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The optional mangled name for this function. If empty, there
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     is no mangled information.
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] func_type
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The optional function type. If NULL, the function type will
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     be parsed on demand when accessed using the
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     Function::GetType() function by asking the SymbolFile
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     plug-in to get the type for \a func_type_uid.
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] range
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The section offset based address for this function.
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Function (
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CompileUnit *comp_unit,
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        lldb::user_id_t func_uid,
36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        lldb::user_id_t func_type_uid,
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const Mangled &mangled,
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Type * func_type,
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const AddressRange& range);
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Construct with a compile unit, function UID, function type UID,
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// optional mangled name, function type, and a section offset
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// based address range.
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] comp_unit
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The compile unit to which this function belongs.
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] func_uid
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The UID for this function. This value is provided by the
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     SymbolFile plug-in and can be any value that allows
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     the plug-in to quickly find and parse more detailed
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     information when and if more information is needed.
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] func_type_uid
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The type UID for the function Type to allow for lazy type
38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     parsing from the debug information.
38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] mangled
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The optional mangled name for this function. If empty, there
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     is no mangled information.
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] func_type
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The optional function type. If NULL, the function type will
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     be parsed on demand when accessed using the
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     Function::GetType() function by asking the SymbolFile
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     plug-in to get the type for \a func_type_uid.
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] range
39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The section offset based address for this function.
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Function (
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CompileUnit *comp_unit,
40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        lldb::user_id_t func_uid,
40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        lldb::user_id_t func_type_uid,
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const char *mangled,
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Type * func_type,
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const AddressRange& range);
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Destructor.
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~Function ();
41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @copydoc SymbolContextScope::CalculateSymbolContext(SymbolContext*)
41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @see SymbolContextScope
41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual void
41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CalculateSymbolContext(SymbolContext* sc);
42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const AddressRange &
42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetAddressRange();
42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Get accessor for the block list.
42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The block list object that describes all lexical blocks
42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     in the function.
43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @see BlockList
43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    BlockList&
43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetBlocks (bool can_create);
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Get accessor for the compile unit that owns this function.
43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A compile unit object pointer.
44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CompileUnit*
44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetCompileUnit();
44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Get const accessor for the compile unit that owns this function.
44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A const compile unit object pointer.
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const CompileUnit*
45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetCompileUnit() const;
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Get accessor for the frame base location.
45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A location expression that describes the function frame
45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     base.
46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DWARFExpression &
46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetFrameBaseExpression()
46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_frame_base;
46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Get const accessor for the frame base location.
46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A const compile unit object pointer.
47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const DWARFExpression &
47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetFrameBaseExpression() const
47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_frame_base;
47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Mangled &
48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetMangled() const
48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_mangled;
48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Get accessor for the type that describes the function
48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// return value type, and paramter types.
48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A type object pointer.
49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Type*
49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetType();
49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Get const accessor for the type that describes the function
49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// return value type, and paramter types.
49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A const type object pointer.
50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Type*
50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetType() const;
50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Type
50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetReturnType ();
50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // The Number of arguments, or -1 for an unprototyped function.
50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int
51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetArgumentCount ();
51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Type
51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetArgumentTypeAtIndex (size_t idx);
51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *
51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetArgumentNameAtIndex (size_t idx);
51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    IsVariadic ();
52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t
52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetPrologueByteSize ();
52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Dump a description of this object to a Stream.
52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Dump a description of the contents of this object to the
52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// supplied stream \a s.
52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] s
53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The stream to which to dump the object descripton.
53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] show_context
53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     If \b true, variables will dump their symbol context
53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     information.
53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Dump(Stream *s, bool show_context) const;
53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
54124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @copydoc SymbolContextScope::DumpSymbolContext(Stream*)
54224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @see SymbolContextScope
54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual void
54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DumpSymbolContext(Stream *s);
54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Get the memory cost of this object.
55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The number of bytes that this object occupies in memory.
55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The returned value does not include the bytes for any
55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     shared string values.
55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @see ConstString::StaticMemorySize ()
55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t
55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    MemorySize () const;
56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    enum
56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        flagsCalculatedPrologueSize = (1 << 0), ///< Have we already tried to calculate the prologue size?
56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Member variables.
57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CompileUnit *m_comp_unit;   ///< The compile unit that owns this function.
57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::user_id_t m_type_uid;     ///< The user ID of for the prototype Type for this function.
57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Type * m_type;         ///< The function prototype type for this function that include the function info (FunctionInfo), return type and parameters.
57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mangled m_mangled;      ///< The mangled function name if any, if empty, there is no mangled information.
57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    BlockList m_blocks;       ///< All lexical blocks contained in this function.
57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DWARFExpression m_frame_base;   ///< The frame base expression for variables that are relative to the frame pointer.
57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Flags m_flags;
58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t m_prologue_byte_size; ///< Compute the prologue size once and cache it
58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate:
58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DISALLOW_COPY_AND_ASSIGN(Function);
58324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private
58624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
58724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // liblldb_Function_h_
588