blob: 34f879af70932f9e8d0bfa8891d48de56655299a [file] [log] [blame]
Chris Lattner24943d22010-06-08 16:52:24 +00001//===-- SBFunction.cpp ------------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "lldb/API/SBFunction.h"
11#include "lldb/API/SBProcess.h"
Caroline Tice98f930f2010-09-20 05:20:02 +000012#include "lldb/API/SBStream.h"
Greg Clayton5c4c7462010-10-06 03:09:58 +000013#include "lldb/Core/Disassembler.h"
Caroline Tice7826c882010-10-26 03:11:13 +000014#include "lldb/Core/Log.h"
Greg Clayton5c4c7462010-10-06 03:09:58 +000015#include "lldb/Core/Module.h"
16#include "lldb/Symbol/CompileUnit.h"
Chris Lattner24943d22010-06-08 16:52:24 +000017#include "lldb/Symbol/Function.h"
Greg Claytond8c62532010-10-07 04:19:01 +000018#include "lldb/Symbol/Type.h"
Greg Clayton5c4c7462010-10-06 03:09:58 +000019#include "lldb/Target/ExecutionContext.h"
20#include "lldb/Target/Target.h"
Chris Lattner24943d22010-06-08 16:52:24 +000021
22using namespace lldb;
Greg Clayton5c4c7462010-10-06 03:09:58 +000023using namespace lldb_private;
Chris Lattner24943d22010-06-08 16:52:24 +000024
25SBFunction::SBFunction () :
Greg Clayton63094e02010-06-23 01:19:29 +000026 m_opaque_ptr (NULL)
Chris Lattner24943d22010-06-08 16:52:24 +000027{
28}
29
30SBFunction::SBFunction (lldb_private::Function *lldb_object_ptr) :
Greg Clayton63094e02010-06-23 01:19:29 +000031 m_opaque_ptr (lldb_object_ptr)
Chris Lattner24943d22010-06-08 16:52:24 +000032{
33}
34
35SBFunction::~SBFunction ()
36{
Greg Clayton63094e02010-06-23 01:19:29 +000037 m_opaque_ptr = NULL;
Chris Lattner24943d22010-06-08 16:52:24 +000038}
39
40bool
41SBFunction::IsValid () const
42{
Greg Clayton63094e02010-06-23 01:19:29 +000043 return m_opaque_ptr != NULL;
Chris Lattner24943d22010-06-08 16:52:24 +000044}
45
46const char *
47SBFunction::GetName() const
48{
Greg Clayton49ce6822010-10-31 03:01:06 +000049 const char *cstr = NULL;
Greg Clayton63094e02010-06-23 01:19:29 +000050 if (m_opaque_ptr)
Greg Clayton49ce6822010-10-31 03:01:06 +000051 cstr = m_opaque_ptr->GetMangled().GetName().AsCString();
Caroline Tice7826c882010-10-26 03:11:13 +000052
Greg Clayton49ce6822010-10-31 03:01:06 +000053 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
Caroline Tice7826c882010-10-26 03:11:13 +000054 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +000055 {
56 if (cstr)
57 log->Printf ("SBFunction(%p)::GetName () => \"%s\"", m_opaque_ptr, cstr);
58 else
59 log->Printf ("SBFunction(%p)::GetName () => NULL", m_opaque_ptr);
60 }
61 return cstr;
Chris Lattner24943d22010-06-08 16:52:24 +000062}
63
64const char *
65SBFunction::GetMangledName () const
66{
Greg Clayton49ce6822010-10-31 03:01:06 +000067 const char *cstr = NULL;
Greg Clayton63094e02010-06-23 01:19:29 +000068 if (m_opaque_ptr)
Greg Clayton49ce6822010-10-31 03:01:06 +000069 cstr = m_opaque_ptr->GetMangled().GetMangledName().AsCString();
70 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
71 if (log)
72 {
73 if (cstr)
74 log->Printf ("SBFunction(%p)::GetMangledName () => \"%s\"", m_opaque_ptr, cstr);
75 else
76 log->Printf ("SBFunction(%p)::GetMangledName () => NULL", m_opaque_ptr);
77 }
78 return cstr;
Chris Lattner24943d22010-06-08 16:52:24 +000079}
80
81bool
82SBFunction::operator == (const SBFunction &rhs) const
83{
Greg Clayton63094e02010-06-23 01:19:29 +000084 return m_opaque_ptr == rhs.m_opaque_ptr;
Chris Lattner24943d22010-06-08 16:52:24 +000085}
86
87bool
88SBFunction::operator != (const SBFunction &rhs) const
89{
Greg Clayton63094e02010-06-23 01:19:29 +000090 return m_opaque_ptr != rhs.m_opaque_ptr;
Chris Lattner24943d22010-06-08 16:52:24 +000091}
Caroline Tice98f930f2010-09-20 05:20:02 +000092
93bool
Greg Claytond8c62532010-10-07 04:19:01 +000094SBFunction::GetDescription (SBStream &s)
Caroline Tice98f930f2010-09-20 05:20:02 +000095{
96 if (m_opaque_ptr)
97 {
Greg Claytond8c62532010-10-07 04:19:01 +000098 s.Printf ("SBFunction: id = 0x%8.8x, name = %s",
99 m_opaque_ptr->GetID(),
100 m_opaque_ptr->GetName().AsCString());
101 Type *func_type = m_opaque_ptr->GetType();
102 if (func_type)
103 s.Printf(", type = %s", func_type->GetName().AsCString());
104 return true;
Caroline Tice98f930f2010-09-20 05:20:02 +0000105 }
Greg Claytond8c62532010-10-07 04:19:01 +0000106 s.Printf ("No value");
107 return false;
Caroline Tice98f930f2010-09-20 05:20:02 +0000108}
Greg Clayton5c4c7462010-10-06 03:09:58 +0000109
110SBInstructionList
111SBFunction::GetInstructions (SBTarget target)
112{
113 SBInstructionList sb_instructions;
114 if (m_opaque_ptr)
115 {
116 ExecutionContext exe_ctx;
117 if (target.IsValid())
118 {
119 target->CalculateExecutionContext (exe_ctx);
120 exe_ctx.process = target->GetProcessSP().get();
121 }
122 Module *module = m_opaque_ptr->GetAddressRange().GetBaseAddress().GetModule();
123 if (module)
124 {
125 sb_instructions.SetDisassembler (Disassembler::DisassembleRange (module->GetArchitecture(),
126 exe_ctx,
127 m_opaque_ptr->GetAddressRange()));
128 }
129 }
130 return sb_instructions;
131}
132
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000133lldb_private::Function *
134SBFunction::get ()
135{
136 return m_opaque_ptr;
137}
Greg Clayton5c4c7462010-10-06 03:09:58 +0000138