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