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
13c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan#include "lldb/Core/ClangForward.h"
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/AddressRange.h"
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Block.h"
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Declaration.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Expression/DWARFExpression.h"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Mangled.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/UserID.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private {
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// @class FunctionInfo Function.h "lldb/Symbol/Function.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// @brief A class that contains generic function information.
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// This provides generic function information that gets resused between
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// inline functions and function types.
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass FunctionInfo
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Construct with the function method name and optional declaration
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// information.
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] name
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A C string name for the method name for this function. This
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     value should not be the mangled named, but the simple method
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     name.
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] decl_ptr
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     Optional declaration information that describes where the
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     function was declared. This can be NULL.
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    FunctionInfo (const char *name, const Declaration *decl_ptr);
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Construct with the function method name and optional declaration
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// information.
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] name
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A name for the method name for this function. This value
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     should not be the mangled named, but the simple method name.
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] decl_ptr
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     Optional declaration information that describes where the
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     function was declared. This can be NULL.
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    FunctionInfo (const ConstString& name, const Declaration *decl_ptr);
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Destructor.
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// The destructor is virtual since classes inherit from this class.
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~FunctionInfo ();
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Compare two function information objects.
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// First compares the method names, and if equal, then compares
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// the declaration information.
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] lhs
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The Left Hand Side const FunctionInfo object reference.
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] rhs
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The Right Hand Side const FunctionInfo object reference.
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     @li -1 if lhs < rhs
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     @li 0 if lhs == rhs
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     @li 1 if lhs > rhs
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static int
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Compare (const FunctionInfo& lhs, const FunctionInfo& rhs);
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Dump a description of this object to a Stream.
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Dump a description of the contents of this object to the
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// supplied stream \a s.
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] s
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The stream to which to dump the object descripton.
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
1001924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    Dump (Stream *s, bool show_fullpaths) const;
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Get accessor for the declaration information.
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A reference to the declaration object.
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Declaration&
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetDeclaration ();
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Get const accessor for the declaration information.
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A const reference to the declaration object.
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Declaration&
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetDeclaration () const;
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Get accessor for the method name.
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A const reference to the method name object.
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const ConstString&
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetName () const;
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Get the memory cost of this object.
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The number of bytes that this object occupies in memory.
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The returned value does not include the bytes for any
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     shared string values.
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @see ConstString::StaticMemorySize ()
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual size_t
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    MemorySize () const;
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Member variables.
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ConstString m_name; ///< Function method name (not a mangled name).
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Declaration m_declaration; ///< Information describing where this function information was defined.
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// @class InlineFunctionInfo Function.h "lldb/Symbol/Function.h"
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// @brief A class that describes information for an inlined function.
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass InlineFunctionInfo : public FunctionInfo
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Construct with the function method name, mangled name, and
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// optional declaration information.
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] name
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A C string name for the method name for this function. This
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     value should not be the mangled named, but the simple method
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     name.
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] mangled
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A C string name for the mangled name for this function. This
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     value can be NULL if there is no mangled information.
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] decl_ptr
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     Optional declaration information that describes where the
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     function was declared. This can be NULL.
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] call_decl_ptr
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     Optional calling location declaration information that
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     describes from where this inlined function was called.
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    InlineFunctionInfo(const char *name, const char *mangled, const Declaration *decl_ptr, const Declaration *call_decl_ptr);
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Construct with the function method name, mangled name, and
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// optional declaration information.
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] name
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A name for the method name for this function. This value
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     should not be the mangled named, but the simple method name.
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] mangled
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A name for the mangled name for this function. This value
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     can be empty if there is no mangled information.
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] decl_ptr
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     Optional declaration information that describes where the
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     function was declared. This can be NULL.
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] call_decl_ptr
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     Optional calling location declaration information that
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     describes from where this inlined function was called.
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    InlineFunctionInfo(const ConstString& name, const Mangled &mangled, const Declaration *decl_ptr, const Declaration *call_decl_ptr);
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Destructor.
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~InlineFunctionInfo();
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Compare two inlined function information objects.
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// First compares the FunctionInfo objects, and if equal,
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// compares the mangled names.
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] lhs
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The Left Hand Side const InlineFunctionInfo object
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     reference.
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] rhs
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The Right Hand Side const InlineFunctionInfo object
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     reference.
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     @li -1 if lhs < rhs
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     @li 0 if lhs == rhs
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     @li 1 if lhs > rhs
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Compare(const InlineFunctionInfo& lhs, const InlineFunctionInfo& rhs);
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Dump a description of this object to a Stream.
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Dump a description of the contents of this object to the
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// supplied stream \a s.
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] s
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The stream to which to dump the object descripton.
23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
2401924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    Dump(Stream *s, bool show_fullpaths) const;
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DumpStopContext (Stream *s) const;
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24533ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton    const ConstString &
24633ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton    GetName () const;
24733ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Get accessor for the call site declaration information.
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A reference to the declaration object.
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Declaration&
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetCallSite ();
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Get const accessor for the call site declaration information.
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A const reference to the declaration object.
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Declaration&
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetCallSite () const;
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Get accessor for the mangled name object.
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A reference to the mangled name object.
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mangled&
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetMangled();
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Get const accessor for the mangled name object.
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A const reference to the mangled name object.
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Mangled&
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetMangled() const;
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Get the memory cost of this object.
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The number of bytes that this object occupies in memory.
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The returned value does not include the bytes for any
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     shared string values.
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @see ConstString::StaticMemorySize ()
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual size_t
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    MemorySize() const;
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate:
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Member variables.
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mangled m_mangled; ///< Mangled inlined function name (can be empty if there is no mangled information).
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Declaration m_call_decl;
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// @class Function Function.h "lldb/Symbol/Function.h"
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// @brief A class that describes a function.
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// Functions belong to CompileUnit objects (Function::m_comp_unit),
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// have unique user IDs (Function::UserID), know how to reconstruct
31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// their symbol context (Function::SymbolContextScope), have a
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// specific function type (Function::m_type_uid), have a simple
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// method name (FunctionInfo::m_name), be declared at a specific
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// location (FunctionInfo::m_declaration), possibly have mangled
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// names (Function::m_mangled), an optional return type
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// (Function::m_type), and contains lexical blocks
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// (Function::m_blocks).
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// The function inforation is split into a few pieces:
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///     @li The concrete instance information
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///     @li The abstract information
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// The abstract information is found in the function type (Type) that
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// describes a function information, return type and parameter types.
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// The concreate information is the address range information and
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// specific locations for an instance of this function.
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass Function :
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    public UserID,
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    public SymbolContextScope
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Construct with a compile unit, function UID, function type UID,
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// optional mangled name, function type, and a section offset
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// based address range.
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] comp_unit
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The compile unit to which this function belongs.
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] func_uid
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The UID for this function. This value is provided by the
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     SymbolFile plug-in and can be any value that allows
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     the plug-in to quickly find and parse more detailed
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     information when and if more information is needed.
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] func_type_uid
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The type UID for the function Type to allow for lazy type
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     parsing from the debug information.
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] mangled
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The optional mangled name for this function. If empty, there
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     is no mangled information.
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] func_type
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The optional function type. If NULL, the function type will
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     be parsed on demand when accessed using the
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     Function::GetType() function by asking the SymbolFile
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     plug-in to get the type for \a func_type_uid.
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] range
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The section offset based address for this function.
36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Function (
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CompileUnit *comp_unit,
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        lldb::user_id_t func_uid,
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        lldb::user_id_t func_type_uid,
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const Mangled &mangled,
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Type * func_type,
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const AddressRange& range);
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Construct with a compile unit, function UID, function type UID,
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// optional mangled name, function type, and a section offset
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// based address range.
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] comp_unit
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The compile unit to which this function belongs.
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] func_uid
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The UID for this function. This value is provided by the
38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     SymbolFile plug-in and can be any value that allows
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     the plug-in to quickly find and parse more detailed
38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     information when and if more information is needed.
38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] func_type_uid
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The type UID for the function Type to allow for lazy type
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     parsing from the debug information.
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] mangled
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The optional mangled name for this function. If empty, there
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     is no mangled information.
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] func_type
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The optional function type. If NULL, the function type will
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     be parsed on demand when accessed using the
39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     Function::GetType() function by asking the SymbolFile
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     plug-in to get the type for \a func_type_uid.
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] range
40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The section offset based address for this function.
40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Function (
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CompileUnit *comp_unit,
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        lldb::user_id_t func_uid,
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        lldb::user_id_t func_type_uid,
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const char *mangled,
40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Type * func_type,
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const AddressRange& range);
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Destructor.
41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~Function ();
41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @copydoc SymbolContextScope::CalculateSymbolContext(SymbolContext*)
41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @see SymbolContextScope
42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual void
42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CalculateSymbolContext(SymbolContext* sc);
42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4253508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton    virtual lldb::ModuleSP
426c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    CalculateSymbolContextModule ();
427c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton
428c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    virtual CompileUnit *
429c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    CalculateSymbolContextCompileUnit ();
430c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton
431c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    virtual Function *
432c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    CalculateSymbolContextFunction ();
433c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton
43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const AddressRange &
43575ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    GetAddressRange()
43675ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    {
43775ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton        return m_range;
43875ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    }
43975ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton
440b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham    //------------------------------------------------------------------
441b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham    /// Find the file and line number of the source location of the start
442b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham    /// of the function.  This will use the declaration if present and fall
443b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham    /// back on the line table if that fails.  So there may NOT be a line
444b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham    /// table entry for this source file/line combo.
445b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham    ///
446b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham    /// @param[out] source_file
447b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham    ///     The source file.
448b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham    ///
449b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham    /// @param[out] line_no
450b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham    ///     The line number.
451b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham    //------------------------------------------------------------------
452b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham    void
453b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham    GetStartLineSourceInfo (FileSpec &source_file, uint32_t &line_no);
454b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham
455b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham     //------------------------------------------------------------------
456b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham    /// Find the file and line number of the source location of the end
457b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham    /// of the function.
458b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham    ///
459b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham    ///
460b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham    /// @param[out] source_file
461b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham    ///     The source file.
462b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham    ///
463b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham    /// @param[out] line_no
464b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham    ///     The line number.
465b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham    //------------------------------------------------------------------
4667dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton    void
467b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham    GetEndLineSourceInfo (FileSpec &source_file, uint32_t &line_no);
468b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham
46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Get accessor for the block list.
47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The block list object that describes all lexical blocks
47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     in the function.
47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @see BlockList
47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
47875ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    Block&
47975ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    GetBlock (bool can_create);
48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Get accessor for the compile unit that owns this function.
48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A compile unit object pointer.
48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CompileUnit*
48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetCompileUnit();
48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Get const accessor for the compile unit that owns this function.
49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A const compile unit object pointer.
49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const CompileUnit*
49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetCompileUnit() const;
49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
49912bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    void
500eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton    GetDescription(Stream *s, lldb::DescriptionLevel level, Target *target);
50112bec71b323dc520f0e985a86e09c4712559e115Greg Clayton
50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Get accessor for the frame base location.
50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A location expression that describes the function frame
50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     base.
50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DWARFExpression &
51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetFrameBaseExpression()
51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_frame_base;
51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Get const accessor for the frame base location.
51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A const compile unit object pointer.
52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const DWARFExpression &
52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetFrameBaseExpression() const
52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_frame_base;
52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
527d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    const ConstString &
528d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    GetName() const
529d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    {
530d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton        return m_mangled.GetName();
531d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    }
532d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Mangled &
53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetMangled() const
53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_mangled;
53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
540c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan    /// Get the DeclContext for this function, if available.
541c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan    ///
542c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan    /// @return
543c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan    ///     The DeclContext, or NULL if none exists.
544c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan    //------------------------------------------------------------------
545c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan    clang::DeclContext *
546c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan    GetClangDeclContext();
547c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
548c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan    //------------------------------------------------------------------
54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Get accessor for the type that describes the function
55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// return value type, and paramter types.
55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A type object pointer.
55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Type*
55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetType();
55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Get const accessor for the type that describes the function
56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// return value type, and paramter types.
56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A const type object pointer.
56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Type*
56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetType() const;
56752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
56852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType
56952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetClangType ();
57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t
57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetPrologueByteSize ();
57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Dump a description of this object to a Stream.
57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Dump a description of the contents of this object to the
57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// supplied stream \a s.
57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] s
58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The stream to which to dump the object descripton.
58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
58324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] show_context
58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     If \b true, variables will dump their symbol context
58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     information.
58624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
58724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Dump(Stream *s, bool show_context) const;
58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
59124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @copydoc SymbolContextScope::DumpSymbolContext(Stream*)
59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @see SymbolContextScope
59424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual void
59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DumpSymbolContext(Stream *s);
59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Get the memory cost of this object.
60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The number of bytes that this object occupies in memory.
60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The returned value does not include the bytes for any
60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     shared string values.
60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @see ConstString::StaticMemorySize ()
60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t
60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    MemorySize () const;
61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    enum
61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
615e28824e0b988221c7eedf8e3d212527d2bdac6a7Eli Friedman        flagsCalculatedPrologueSize = (1 << 0)  ///< Have we already tried to calculate the prologue size?
61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Member variables.
62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
62375ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    CompileUnit *m_comp_unit;       ///< The compile unit that owns this function.
62424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::user_id_t m_type_uid;     ///< The user ID of for the prototype Type for this function.
62575ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    Type * m_type;                  ///< The function prototype type for this function that include the function info (FunctionInfo), return type and parameters.
62675ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    Mangled m_mangled;              ///< The mangled function name if any, if empty, there is no mangled information.
62775ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    Block m_block;                  ///< All lexical blocks contained in this function.
62875ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    AddressRange m_range;           ///< The function address range that covers the widest range needed to contain all blocks
62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DWARFExpression m_frame_base;   ///< The frame base expression for variables that are relative to the frame pointer.
63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Flags m_flags;
63175ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    uint32_t m_prologue_byte_size;  ///< Compute the prologue size once and cache it
63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate:
63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DISALLOW_COPY_AND_ASSIGN(Function);
63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
63624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private
63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // liblldb_Function_h_
639