124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Function.cpp --------------------------------------------*- 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#include "lldb/Symbol/Function.h"
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h"
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Section.h"
13df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton#include "lldb/Host/Host.h"
141674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "lldb/Symbol/ClangASTType.h"
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/CompileUnit.h"
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/LineTable.h"
17c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan#include "lldb/Symbol/SymbolFile.h"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolVendor.h"
199b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan#include "llvm/Support/Casting.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21c67b7d13cffeb2c9454635e8a11d65350bce61adGreg Claytonusing namespace lldb;
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Basic function information is contained in the FunctionInfo class.
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// It is designed to contain the name, linkage name, and declaration
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// location.
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFunctionInfo::FunctionInfo (const char *name, const Declaration *decl_ptr) :
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_name(name),
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_declaration(decl_ptr)
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFunctionInfo::FunctionInfo (const ConstString& name, const Declaration *decl_ptr) :
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_name(name),
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_declaration(decl_ptr)
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFunctionInfo::~FunctionInfo()
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
481924e2408687e0ee41976010c6b9410bdd01270dGreg ClaytonFunctionInfo::Dump(Stream *s, bool show_fullpaths) const
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_name)
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        *s << ", name = \"" << m_name << "\"";
521924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    m_declaration.Dump(s, show_fullpaths);
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFunctionInfo::Compare(const FunctionInfo& a, const FunctionInfo& b)
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int result = ConstString::Compare(a.GetName(), b.GetName());
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (result)
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result;
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return Declaration::Compare(a.m_declaration, b.m_declaration);
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDeclaration&
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFunctionInfo::GetDeclaration()
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_declaration;
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Declaration&
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFunctionInfo::GetDeclaration() const
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_declaration;
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString&
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFunctionInfo::GetName() const
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_name;
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFunctionInfo::MemorySize() const
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_name.MemorySize() + m_declaration.MemorySize();
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerInlineFunctionInfo::InlineFunctionInfo
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *name,
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *mangled,
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Declaration *decl_ptr,
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Declaration *call_decl_ptr
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) :
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    FunctionInfo(name, decl_ptr),
100c02400422d5e644a2a486bce5517d46d435a3f02Greg Clayton    m_mangled(ConstString(mangled), true),
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_call_decl (call_decl_ptr)
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerInlineFunctionInfo::InlineFunctionInfo
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const ConstString& name,
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Mangled &mangled,
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Declaration *decl_ptr,
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Declaration *call_decl_ptr
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) :
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    FunctionInfo(name, decl_ptr),
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_mangled(mangled),
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_call_decl (call_decl_ptr)
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerInlineFunctionInfo::~InlineFunctionInfo()
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerInlineFunctionInfo::Compare(const InlineFunctionInfo& a, const InlineFunctionInfo& b)
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int result = FunctionInfo::Compare(a, b);
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (result)
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result;
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // only compare the mangled names if both have them
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return Mangled::Compare(a.m_mangled, a.m_mangled);
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
1341924e2408687e0ee41976010c6b9410bdd01270dGreg ClaytonInlineFunctionInfo::Dump(Stream *s, bool show_fullpaths) const
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1361924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    FunctionInfo::Dump(s, show_fullpaths);
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_mangled)
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_mangled.Dump(s);
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerInlineFunctionInfo::DumpStopContext (Stream *s) const
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    s->Indent("[inlined] ");
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->Indent();
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_mangled)
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        s->PutCString (m_mangled.GetName().AsCString());
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        s->PutCString (m_name.AsCString());
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15233ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton
15333ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Claytonconst ConstString &
15433ed170599d41fe407a4dcf5f0875c75e1ad1375Greg ClaytonInlineFunctionInfo::GetName () const
15533ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton{
15633ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton    if (m_mangled)
15733ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton        return m_mangled.GetName();
15833ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton    return m_name;
15933ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton}
16033ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton
16133ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDeclaration &
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerInlineFunctionInfo::GetCallSite ()
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_call_decl;
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Declaration &
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerInlineFunctionInfo::GetCallSite () const
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_call_decl;
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled&
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerInlineFunctionInfo::GetMangled()
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_mangled;
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Mangled&
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerInlineFunctionInfo::GetMangled() const
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_mangled;
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerInlineFunctionInfo::MemorySize() const
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return FunctionInfo::MemorySize() + m_mangled.MemorySize();
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFunction::Function
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CompileUnit *comp_unit,
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::user_id_t func_uid,
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::user_id_t type_uid,
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Mangled &mangled,
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Type * type,
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const AddressRange& range
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) :
20575ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    UserID (func_uid),
20675ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    m_comp_unit (comp_unit),
20775ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    m_type_uid (type_uid),
20875ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    m_type (type),
20975ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    m_mangled (mangled),
21075ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    m_block (func_uid),
21175ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    m_range (range),
21275ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    m_frame_base (),
21375ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    m_flags (),
21475ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    m_prologue_byte_size (0)
21575ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton{
21675ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    m_block.SetParentScope(this);
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert(comp_unit != NULL);
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFunction::Function
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CompileUnit *comp_unit,
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::user_id_t func_uid,
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::user_id_t type_uid,
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *mangled,
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Type *type,
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const AddressRange &range
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) :
22975ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    UserID (func_uid),
23075ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    m_comp_unit (comp_unit),
23175ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    m_type_uid (type_uid),
23275ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    m_type (type),
233c02400422d5e644a2a486bce5517d46d435a3f02Greg Clayton    m_mangled (ConstString(mangled), true),
23475ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    m_block (func_uid),
23575ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    m_range (range),
23675ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    m_frame_base (),
23775ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    m_flags (),
23875ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    m_prologue_byte_size (0)
23975ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton{
24075ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    m_block.SetParentScope(this);
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert(comp_unit != NULL);
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFunction::~Function()
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
249b75b466aac3fac6f49c429a11129fa5648db3f7cJim Inghamvoid
250b75b466aac3fac6f49c429a11129fa5648db3f7cJim InghamFunction::GetStartLineSourceInfo (FileSpec &source_file, uint32_t &line_no)
251b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham{
252b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham    line_no = 0;
253b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham    source_file.Clear();
254b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham
255b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham    if (m_comp_unit == NULL)
256b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham        return;
257b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham
258b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham    if (m_type != NULL && m_type->GetDeclaration().GetLine() != 0)
259b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham    {
260b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham        source_file = m_type->GetDeclaration().GetFile();
261b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham        line_no = m_type->GetDeclaration().GetLine();
262b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham    }
263b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham    else
264b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham    {
265b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham        LineTable *line_table = m_comp_unit->GetLineTable();
266b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham        if (line_table == NULL)
267b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham            return;
268b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham
269b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham        LineEntry line_entry;
270b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham        if (line_table->FindLineEntryByAddress (GetAddressRange().GetBaseAddress(), line_entry, NULL))
271b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham        {
272b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham            line_no = line_entry.line;
273b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham            source_file = line_entry.file;
274b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham        }
275b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham    }
276b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham}
277b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham
278b75b466aac3fac6f49c429a11129fa5648db3f7cJim Inghamvoid
279b75b466aac3fac6f49c429a11129fa5648db3f7cJim InghamFunction::GetEndLineSourceInfo (FileSpec &source_file, uint32_t &line_no)
280b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham{
281b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham    line_no = 0;
282b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham    source_file.Clear();
283b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham
284b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham    // The -1 is kind of cheesy, but I want to get the last line entry for the given function, not the
285b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham    // first entry of the next.
286b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham    Address scratch_addr(GetAddressRange().GetBaseAddress());
287b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham    scratch_addr.SetOffset (scratch_addr.GetOffset() + GetAddressRange().GetByteSize() - 1);
288b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham
289b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham    LineTable *line_table = m_comp_unit->GetLineTable();
290b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham    if (line_table == NULL)
291b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham        return;
292b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham
293b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham    LineEntry line_entry;
294b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham    if (line_table->FindLineEntryByAddress (scratch_addr, line_entry, NULL))
295b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham    {
296b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham        line_no = line_entry.line;
297b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham        source_file = line_entry.file;
298b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham    }
299b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham}
300b75b466aac3fac6f49c429a11129fa5648db3f7cJim Ingham
30175ccf50c3371d8c8e293af25461705b86fb10a46Greg ClaytonBlock &
30275ccf50c3371d8c8e293af25461705b86fb10a46Greg ClaytonFunction::GetBlock (bool can_create)
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
30475ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    if (!m_block.BlockInfoHasBeenParsed() && can_create)
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SymbolContext sc;
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CalculateSymbolContext(&sc);
308b27e74bad0d68e17268bc813bcdada6ce03f3664Greg Clayton        if (sc.module_sp)
309b27e74bad0d68e17268bc813bcdada6ce03f3664Greg Clayton        {
310b27e74bad0d68e17268bc813bcdada6ce03f3664Greg Clayton            sc.module_sp->GetSymbolVendor()->ParseFunctionBlocks(sc);
311b27e74bad0d68e17268bc813bcdada6ce03f3664Greg Clayton        }
312b27e74bad0d68e17268bc813bcdada6ce03f3664Greg Clayton        else
313b27e74bad0d68e17268bc813bcdada6ce03f3664Greg Clayton        {
314df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            Host::SystemLog (Host::eSystemLogError,
31597a19b21dacd9063bb5475812df7781777262198Greg Clayton                             "error: unable to find module shared pointer for function '%s' in %s\n",
316df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton                             GetName().GetCString(),
31797a19b21dacd9063bb5475812df7781777262198Greg Clayton                             m_comp_unit->GetPath().c_str());
318b27e74bad0d68e17268bc813bcdada6ce03f3664Greg Clayton        }
31975ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton        m_block.SetBlockInfoHasBeenParsed (true, true);
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
32175ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    return m_block;
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCompileUnit*
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFunction::GetCompileUnit()
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_comp_unit;
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst CompileUnit*
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFunction::GetCompileUnit() const
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_comp_unit;
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33612bec71b323dc520f0e985a86e09c4712559e115Greg Clayton
33712bec71b323dc520f0e985a86e09c4712559e115Greg Claytonvoid
338eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg ClaytonFunction::GetDescription(Stream *s, lldb::DescriptionLevel level, Target *target)
33912bec71b323dc520f0e985a86e09c4712559e115Greg Clayton{
34012bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    Type* func_type = GetType();
3416f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham    const char *name = func_type ? func_type->GetName().AsCString() : "<unknown>";
3426f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham
3436f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham    *s << "id = " << (const UserID&)*this << ", name = \"" << name << "\", range = ";
344c67b7d13cffeb2c9454635e8a11d65350bce61adGreg Clayton
345c67b7d13cffeb2c9454635e8a11d65350bce61adGreg Clayton    Address::DumpStyle fallback_style;
346c67b7d13cffeb2c9454635e8a11d65350bce61adGreg Clayton    if (level == eDescriptionLevelVerbose)
347c67b7d13cffeb2c9454635e8a11d65350bce61adGreg Clayton        fallback_style = Address::DumpStyleModuleWithFileAddress;
348c67b7d13cffeb2c9454635e8a11d65350bce61adGreg Clayton    else
349c67b7d13cffeb2c9454635e8a11d65350bce61adGreg Clayton        fallback_style = Address::DumpStyleFileAddress;
350eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton    GetAddressRange().Dump(s, target, Address::DumpStyleLoadAddress, fallback_style);
35112bec71b323dc520f0e985a86e09c4712559e115Greg Clayton}
35212bec71b323dc520f0e985a86e09c4712559e115Greg Clayton
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFunction::Dump(Stream *s, bool show_context) const
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3567e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda    s->Printf("%p: ", this);
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->Indent();
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    *s << "Function" << (const UserID&)*this;
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_mangled.Dump(s);
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_type)
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3647e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda        s->Printf(", type = %p", m_type);
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else if (m_type_uid != LLDB_INVALID_UID)
3673b276dae8a6405b4ba7a1efc36ac7b9a31742c97Greg Clayton    {
3685f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea        s->Printf(", type_uid = 0x%8.8" PRIx64, m_type_uid);
3693b276dae8a6405b4ba7a1efc36ac7b9a31742c97Greg Clayton    }
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->EOL();
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Dump the root object
37375ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    if (m_block.BlockInfoHasBeenParsed ())
37475ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton        m_block.Dump(s, m_range.GetBaseAddress().GetFileAddress(), INT_MAX, show_context);
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFunction::CalculateSymbolContext(SymbolContext* sc)
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    sc->function = this;
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_comp_unit->CalculateSymbolContext(sc);
38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3853508c387c3f0c9ecc439d98048fd7694d41bab1bGreg ClaytonModuleSP
386c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonFunction::CalculateSymbolContextModule ()
387c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton{
3883508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton    SectionSP section_sp (m_range.GetBaseAddress().GetSection());
3893508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton    if (section_sp)
390464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton        return section_sp->GetModule();
3917141018ec9689b8ef98d858d94d989d38881d0ebJim Ingham
392c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    return this->GetCompileUnit()->GetModule();
393c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton}
394c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton
395c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonCompileUnit *
396c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonFunction::CalculateSymbolContextCompileUnit ()
397c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton{
398c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    return this->GetCompileUnit();
399c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton}
400c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton
401c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonFunction *
402c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonFunction::CalculateSymbolContextFunction ()
403c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton{
404c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    return this;
405c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton}
406c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton
407c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton//Symbol *
408c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton//Function::CalculateSymbolContextSymbol ()
409c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton//{
410c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton//    return // TODO: find the symbol for the function???
411c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton//}
412c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton
413c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton
41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFunction::DumpSymbolContext(Stream *s)
41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_comp_unit->DumpSymbolContext(s);
4185f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea    s->Printf(", Function{0x%8.8" PRIx64 "}", GetID());
41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFunction::MemorySize () const
42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
42475ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    size_t mem_size = sizeof(Function) + m_block.MemorySize();
42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return mem_size;
42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
428c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callananclang::DeclContext *
429c617a4cb4a451be9d7e97d7af6e165d282b5390fSean CallananFunction::GetClangDeclContext()
430c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan{
431c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan    SymbolContext sc;
432c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
433c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan    CalculateSymbolContext (&sc);
434c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
435c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan    if (!sc.module_sp)
436c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan        return NULL;
437c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
438c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan    SymbolVendor *sym_vendor = sc.module_sp->GetSymbolVendor();
439c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
440c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan    if (!sym_vendor)
441c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan        return NULL;
442c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
443c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan    SymbolFile *sym_file = sym_vendor->GetSymbolFile();
444c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
445c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan    if (!sym_file)
446c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan        return NULL;
447c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
448c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan    return sym_file->GetClangDeclContextForTypeUID (sc, m_uid);
449c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan}
450c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerType*
45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFunction::GetType()
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4546c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton    if (m_type == NULL)
4556c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton    {
4566c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton        SymbolContext sc;
4576c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton
4586c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton        CalculateSymbolContext (&sc);
4596c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton
4606c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton        if (!sc.module_sp)
4616c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton            return NULL;
4626c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton
4636c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton        SymbolVendor *sym_vendor = sc.module_sp->GetSymbolVendor();
4646c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton
4656c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton        if (sym_vendor == NULL)
4666c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton            return NULL;
4676c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton
4686c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton        SymbolFile *sym_file = sym_vendor->GetSymbolFile();
4696c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton
4706c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton        if (sym_file == NULL)
4716c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton            return NULL;
4726c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton
473b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton        m_type = sym_file->ResolveTypeUID(m_type_uid);
4746c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton    }
47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_type;
47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Type*
47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFunction::GetType() const
48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_type;
48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
48452f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
48552f792329be5db8e38961350589e97e8f2823acdGreg ClaytonFunction::GetClangType()
48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
48752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    Type *function_type = GetType();
48852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (function_type)
48952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return function_type->GetClangFullType();
49052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTType();
49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFunction::GetPrologueByteSize ()
49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_prologue_byte_size == 0 && m_flags.IsClear(flagsCalculatedPrologueSize))
49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_flags.Set(flagsCalculatedPrologueSize);
49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        LineTable* line_table = m_comp_unit->GetLineTable ();
50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (line_table)
50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
502356bcc02370847df8ffae1d9e60875fa3da529d9Greg Clayton            LineEntry first_line_entry;
503356bcc02370847df8ffae1d9e60875fa3da529d9Greg Clayton            uint32_t first_line_entry_idx = UINT32_MAX;
504356bcc02370847df8ffae1d9e60875fa3da529d9Greg Clayton            if (line_table->FindLineEntryByAddress(GetAddressRange().GetBaseAddress(), first_line_entry, &first_line_entry_idx))
5052b8732ce9f5371ee592aba406ea1185876992e56Greg Clayton            {
506356bcc02370847df8ffae1d9e60875fa3da529d9Greg Clayton                // Make sure the first line entry isn't already the end of the prologue
507356bcc02370847df8ffae1d9e60875fa3da529d9Greg Clayton                addr_t prologue_end_file_addr = LLDB_INVALID_ADDRESS;
508356bcc02370847df8ffae1d9e60875fa3da529d9Greg Clayton                if (first_line_entry.is_prologue_end)
509356bcc02370847df8ffae1d9e60875fa3da529d9Greg Clayton                {
510356bcc02370847df8ffae1d9e60875fa3da529d9Greg Clayton                    prologue_end_file_addr = first_line_entry.range.GetBaseAddress().GetFileAddress();
511356bcc02370847df8ffae1d9e60875fa3da529d9Greg Clayton                }
512356bcc02370847df8ffae1d9e60875fa3da529d9Greg Clayton                else
513356bcc02370847df8ffae1d9e60875fa3da529d9Greg Clayton                {
514356bcc02370847df8ffae1d9e60875fa3da529d9Greg Clayton                    // Check the first few instructions and look for one that has
515356bcc02370847df8ffae1d9e60875fa3da529d9Greg Clayton                    // is_prologue_end set to true.
516356bcc02370847df8ffae1d9e60875fa3da529d9Greg Clayton                    const uint32_t last_line_entry_idx = first_line_entry_idx + 6;
517356bcc02370847df8ffae1d9e60875fa3da529d9Greg Clayton                    for (uint32_t idx = first_line_entry_idx + 1; idx < last_line_entry_idx; ++idx)
518356bcc02370847df8ffae1d9e60875fa3da529d9Greg Clayton                    {
519a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain                        LineEntry line_entry;
520356bcc02370847df8ffae1d9e60875fa3da529d9Greg Clayton                        if (line_table->GetLineEntryAtIndex (idx, line_entry))
521356bcc02370847df8ffae1d9e60875fa3da529d9Greg Clayton                        {
522356bcc02370847df8ffae1d9e60875fa3da529d9Greg Clayton                            if (line_entry.is_prologue_end)
523356bcc02370847df8ffae1d9e60875fa3da529d9Greg Clayton                            {
524356bcc02370847df8ffae1d9e60875fa3da529d9Greg Clayton                                prologue_end_file_addr = line_entry.range.GetBaseAddress().GetFileAddress();
525356bcc02370847df8ffae1d9e60875fa3da529d9Greg Clayton                                break;
526356bcc02370847df8ffae1d9e60875fa3da529d9Greg Clayton                            }
527356bcc02370847df8ffae1d9e60875fa3da529d9Greg Clayton                        }
528356bcc02370847df8ffae1d9e60875fa3da529d9Greg Clayton                    }
529356bcc02370847df8ffae1d9e60875fa3da529d9Greg Clayton                }
530a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain
531356bcc02370847df8ffae1d9e60875fa3da529d9Greg Clayton                // If we didn't find the end of the prologue in the line tables,
532356bcc02370847df8ffae1d9e60875fa3da529d9Greg Clayton                // then just use the end address of the first line table entry
533356bcc02370847df8ffae1d9e60875fa3da529d9Greg Clayton                if (prologue_end_file_addr == LLDB_INVALID_ADDRESS)
534356bcc02370847df8ffae1d9e60875fa3da529d9Greg Clayton                {
535a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain                    // Check the first few instructions and look for one that has
536a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain                    // a line number that's different than the first entry.
537a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain                    const uint32_t last_line_entry_idx = first_line_entry_idx + 6;
538a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain                    for (uint32_t idx = first_line_entry_idx + 1; idx < last_line_entry_idx; ++idx)
539a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain                    {
540a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain                        LineEntry line_entry;
541a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain                        if (line_table->GetLineEntryAtIndex (idx, line_entry))
542a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain                        {
543a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain                            if (line_entry.line != first_line_entry.line)
544a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain                            {
545a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain                                prologue_end_file_addr = line_entry.range.GetBaseAddress().GetFileAddress();
546a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain                                break;
547a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain                            }
548a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain                        }
549a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain                    }
550a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain
551a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain                    if (prologue_end_file_addr == LLDB_INVALID_ADDRESS)
552a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain                    {
553a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain                        prologue_end_file_addr = first_line_entry.range.GetBaseAddress().GetFileAddress() + first_line_entry.range.GetByteSize();
554a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain                    }
555356bcc02370847df8ffae1d9e60875fa3da529d9Greg Clayton                }
5562b8732ce9f5371ee592aba406ea1185876992e56Greg Clayton                const addr_t func_start_file_addr = m_range.GetBaseAddress().GetFileAddress();
557356bcc02370847df8ffae1d9e60875fa3da529d9Greg Clayton                const addr_t func_end_file_addr = func_start_file_addr + m_range.GetByteSize();
558356bcc02370847df8ffae1d9e60875fa3da529d9Greg Clayton
559356bcc02370847df8ffae1d9e60875fa3da529d9Greg Clayton                // Verify that this prologue end file address in the function's
560356bcc02370847df8ffae1d9e60875fa3da529d9Greg Clayton                // address range just to be sure
561356bcc02370847df8ffae1d9e60875fa3da529d9Greg Clayton                if (func_start_file_addr < prologue_end_file_addr && prologue_end_file_addr < func_end_file_addr)
562356bcc02370847df8ffae1d9e60875fa3da529d9Greg Clayton                {
563356bcc02370847df8ffae1d9e60875fa3da529d9Greg Clayton                    m_prologue_byte_size = prologue_end_file_addr - func_start_file_addr;
564356bcc02370847df8ffae1d9e60875fa3da529d9Greg Clayton                }
5652b8732ce9f5371ee592aba406ea1185876992e56Greg Clayton            }
56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_prologue_byte_size;
56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
573