180814287SRaphael Isemann //===-- SBFunction.cpp ----------------------------------------------------===//
230fdc8d8SChris Lattner //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
630fdc8d8SChris Lattner //
730fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
830fdc8d8SChris Lattner
930fdc8d8SChris Lattner #include "lldb/API/SBFunction.h"
1030fdc8d8SChris Lattner #include "lldb/API/SBProcess.h"
11dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
121d273166SGreg Clayton #include "lldb/Core/Disassembler.h"
131d273166SGreg Clayton #include "lldb/Core/Module.h"
141d273166SGreg Clayton #include "lldb/Symbol/CompileUnit.h"
1530fdc8d8SChris Lattner #include "lldb/Symbol/Function.h"
1605faeb71SGreg Clayton #include "lldb/Symbol/Type.h"
17fe68904fSGreg Clayton #include "lldb/Symbol/VariableList.h"
181d273166SGreg Clayton #include "lldb/Target/ExecutionContext.h"
191d273166SGreg Clayton #include "lldb/Target/Target.h"
20*1755f5b1SJonas Devlieghere #include "lldb/Utility/Instrumentation.h"
2130fdc8d8SChris Lattner
2230fdc8d8SChris Lattner using namespace lldb;
231d273166SGreg Clayton using namespace lldb_private;
2430fdc8d8SChris Lattner
SBFunction()25*1755f5b1SJonas Devlieghere SBFunction::SBFunction() { LLDB_INSTRUMENT_VA(this); }
2630fdc8d8SChris Lattner
SBFunction(lldb_private::Function * lldb_object_ptr)27b9c1b51eSKate Stone SBFunction::SBFunction(lldb_private::Function *lldb_object_ptr)
28b9c1b51eSKate Stone : m_opaque_ptr(lldb_object_ptr) {}
2930fdc8d8SChris Lattner
SBFunction(const lldb::SBFunction & rhs)30b9c1b51eSKate Stone SBFunction::SBFunction(const lldb::SBFunction &rhs)
31baf5664fSJonas Devlieghere : m_opaque_ptr(rhs.m_opaque_ptr) {
32*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, rhs);
33baf5664fSJonas Devlieghere }
34efabb123SGreg Clayton
operator =(const SBFunction & rhs)35b9c1b51eSKate Stone const SBFunction &SBFunction::operator=(const SBFunction &rhs) {
36*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, rhs);
37baf5664fSJonas Devlieghere
38efabb123SGreg Clayton m_opaque_ptr = rhs.m_opaque_ptr;
39d232abc3SJonas Devlieghere return *this;
40efabb123SGreg Clayton }
41efabb123SGreg Clayton
~SBFunction()42248a1305SKonrad Kleine SBFunction::~SBFunction() { m_opaque_ptr = nullptr; }
4330fdc8d8SChris Lattner
IsValid() const44baf5664fSJonas Devlieghere bool SBFunction::IsValid() const {
45*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
467f5237bcSPavel Labath return this->operator bool();
477f5237bcSPavel Labath }
operator bool() const487f5237bcSPavel Labath SBFunction::operator bool() const {
49*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
50baf5664fSJonas Devlieghere
51248a1305SKonrad Kleine return m_opaque_ptr != nullptr;
52baf5664fSJonas Devlieghere }
5330fdc8d8SChris Lattner
GetName() const54b9c1b51eSKate Stone const char *SBFunction::GetName() const {
55*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
56baf5664fSJonas Devlieghere
57248a1305SKonrad Kleine const char *cstr = nullptr;
586611103cSGreg Clayton if (m_opaque_ptr)
59ddaf6a72SGreg Clayton cstr = m_opaque_ptr->GetName().AsCString();
60ceb6b139SCaroline Tice
61cfd1acedSGreg Clayton return cstr;
6230fdc8d8SChris Lattner }
6330fdc8d8SChris Lattner
GetDisplayName() const64b9c1b51eSKate Stone const char *SBFunction::GetDisplayName() const {
65*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
66baf5664fSJonas Devlieghere
67248a1305SKonrad Kleine const char *cstr = nullptr;
68c1f705c2SEnrico Granata if (m_opaque_ptr)
6922b04487SAlex Langford cstr = m_opaque_ptr->GetMangled().GetDisplayDemangledName().AsCString();
70c1f705c2SEnrico Granata
71c1f705c2SEnrico Granata return cstr;
72c1f705c2SEnrico Granata }
73c1f705c2SEnrico Granata
GetMangledName() const74b9c1b51eSKate Stone const char *SBFunction::GetMangledName() const {
75*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
76baf5664fSJonas Devlieghere
77248a1305SKonrad Kleine const char *cstr = nullptr;
786611103cSGreg Clayton if (m_opaque_ptr)
79cfd1acedSGreg Clayton cstr = m_opaque_ptr->GetMangled().GetMangledName().AsCString();
80cfd1acedSGreg Clayton return cstr;
8130fdc8d8SChris Lattner }
8230fdc8d8SChris Lattner
operator ==(const SBFunction & rhs) const83b9c1b51eSKate Stone bool SBFunction::operator==(const SBFunction &rhs) const {
84*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, rhs);
85baf5664fSJonas Devlieghere
866611103cSGreg Clayton return m_opaque_ptr == rhs.m_opaque_ptr;
8730fdc8d8SChris Lattner }
8830fdc8d8SChris Lattner
operator !=(const SBFunction & rhs) const89b9c1b51eSKate Stone bool SBFunction::operator!=(const SBFunction &rhs) const {
90*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, rhs);
91baf5664fSJonas Devlieghere
926611103cSGreg Clayton return m_opaque_ptr != rhs.m_opaque_ptr;
9330fdc8d8SChris Lattner }
94dde9cff3SCaroline Tice
GetDescription(SBStream & s)95b9c1b51eSKate Stone bool SBFunction::GetDescription(SBStream &s) {
96*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, s);
97baf5664fSJonas Devlieghere
98b9c1b51eSKate Stone if (m_opaque_ptr) {
99d01b2953SDaniel Malea s.Printf("SBFunction: id = 0x%8.8" PRIx64 ", name = %s",
100b9c1b51eSKate Stone m_opaque_ptr->GetID(), m_opaque_ptr->GetName().AsCString());
10105faeb71SGreg Clayton Type *func_type = m_opaque_ptr->GetType();
10205faeb71SGreg Clayton if (func_type)
10305faeb71SGreg Clayton s.Printf(", type = %s", func_type->GetName().AsCString());
104dde9cff3SCaroline Tice return true;
105dde9cff3SCaroline Tice }
10605faeb71SGreg Clayton s.Printf("No value");
10705faeb71SGreg Clayton return false;
10805faeb71SGreg Clayton }
1091d273166SGreg Clayton
GetInstructions(SBTarget target)110b9c1b51eSKate Stone SBInstructionList SBFunction::GetInstructions(SBTarget target) {
111*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, target);
112baf5664fSJonas Devlieghere
113d232abc3SJonas Devlieghere return GetInstructions(target, nullptr);
1140f063ba6SJim Ingham }
1150f063ba6SJim Ingham
GetInstructions(SBTarget target,const char * flavor)116b9c1b51eSKate Stone SBInstructionList SBFunction::GetInstructions(SBTarget target,
117b9c1b51eSKate Stone const char *flavor) {
118*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, target, flavor);
119baf5664fSJonas Devlieghere
1201d273166SGreg Clayton SBInstructionList sb_instructions;
121b9c1b51eSKate Stone if (m_opaque_ptr) {
122b9556accSGreg Clayton TargetSP target_sp(target.GetSP());
123bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock;
124b9c1b51eSKate Stone ModuleSP module_sp(
125b9c1b51eSKate Stone m_opaque_ptr->GetAddressRange().GetBaseAddress().GetModule());
12604592d5bSPavel Labath if (target_sp && module_sp) {
12704592d5bSPavel Labath lock = std::unique_lock<std::recursive_mutex>(target_sp->GetAPIMutex());
128e9fe788dSJason Molenda const bool force_live_memory = true;
129b9c1b51eSKate Stone sb_instructions.SetDisassembler(Disassembler::DisassembleRange(
13004592d5bSPavel Labath module_sp->GetArchitecture(), nullptr, flavor, *target_sp,
131e9fe788dSJason Molenda m_opaque_ptr->GetAddressRange(), force_live_memory));
1321d273166SGreg Clayton }
1331d273166SGreg Clayton }
134d232abc3SJonas Devlieghere return sb_instructions;
1351d273166SGreg Clayton }
1361d273166SGreg Clayton
get()137b9c1b51eSKate Stone lldb_private::Function *SBFunction::get() { return m_opaque_ptr; }
1381d273166SGreg Clayton
reset(lldb_private::Function * lldb_object_ptr)139b9c1b51eSKate Stone void SBFunction::reset(lldb_private::Function *lldb_object_ptr) {
14072eff18aSGreg Clayton m_opaque_ptr = lldb_object_ptr;
14172eff18aSGreg Clayton }
14272eff18aSGreg Clayton
GetStartAddress()143b9c1b51eSKate Stone SBAddress SBFunction::GetStartAddress() {
144*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
145baf5664fSJonas Devlieghere
14693d00df5SGreg Clayton SBAddress addr;
14793d00df5SGreg Clayton if (m_opaque_ptr)
1486cd4a4cdSJonas Devlieghere addr.SetAddress(m_opaque_ptr->GetAddressRange().GetBaseAddress());
149d232abc3SJonas Devlieghere return addr;
15093d00df5SGreg Clayton }
15193d00df5SGreg Clayton
GetEndAddress()152b9c1b51eSKate Stone SBAddress SBFunction::GetEndAddress() {
153*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
154baf5664fSJonas Devlieghere
15593d00df5SGreg Clayton SBAddress addr;
156b9c1b51eSKate Stone if (m_opaque_ptr) {
15793d00df5SGreg Clayton addr_t byte_size = m_opaque_ptr->GetAddressRange().GetByteSize();
158b9c1b51eSKate Stone if (byte_size > 0) {
1596cd4a4cdSJonas Devlieghere addr.SetAddress(m_opaque_ptr->GetAddressRange().GetBaseAddress());
16093d00df5SGreg Clayton addr->Slide(byte_size);
16193d00df5SGreg Clayton }
16293d00df5SGreg Clayton }
163d232abc3SJonas Devlieghere return addr;
16493d00df5SGreg Clayton }
16593d00df5SGreg Clayton
GetArgumentName(uint32_t arg_idx)166b9c1b51eSKate Stone const char *SBFunction::GetArgumentName(uint32_t arg_idx) {
167*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, arg_idx);
168baf5664fSJonas Devlieghere
169b9c1b51eSKate Stone if (m_opaque_ptr) {
170fe68904fSGreg Clayton Block &block = m_opaque_ptr->GetBlock(true);
171fe68904fSGreg Clayton VariableListSP variable_list_sp = block.GetBlockVariableList(true);
172b9c1b51eSKate Stone if (variable_list_sp) {
173fe68904fSGreg Clayton VariableList arguments;
174b9c1b51eSKate Stone variable_list_sp->AppendVariablesWithScope(eValueTypeVariableArgument,
175b9c1b51eSKate Stone arguments, true);
176fe68904fSGreg Clayton lldb::VariableSP variable_sp = arguments.GetVariableAtIndex(arg_idx);
177fe68904fSGreg Clayton if (variable_sp)
178fe68904fSGreg Clayton return variable_sp->GetName().GetCString();
179fe68904fSGreg Clayton }
180fe68904fSGreg Clayton }
181fe68904fSGreg Clayton return nullptr;
182fe68904fSGreg Clayton }
18393d00df5SGreg Clayton
GetPrologueByteSize()184b9c1b51eSKate Stone uint32_t SBFunction::GetPrologueByteSize() {
185*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
186baf5664fSJonas Devlieghere
18793d00df5SGreg Clayton if (m_opaque_ptr)
18893d00df5SGreg Clayton return m_opaque_ptr->GetPrologueByteSize();
18993d00df5SGreg Clayton return 0;
19093d00df5SGreg Clayton }
19193d00df5SGreg Clayton
GetType()192b9c1b51eSKate Stone SBType SBFunction::GetType() {
193*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
194baf5664fSJonas Devlieghere
1955569e64eSGreg Clayton SBType sb_type;
196b9c1b51eSKate Stone if (m_opaque_ptr) {
1975569e64eSGreg Clayton Type *function_type = m_opaque_ptr->GetType();
1985569e64eSGreg Clayton if (function_type)
1995569e64eSGreg Clayton sb_type.ref().SetType(function_type->shared_from_this());
2005569e64eSGreg Clayton }
201d232abc3SJonas Devlieghere return sb_type;
2025569e64eSGreg Clayton }
2035569e64eSGreg Clayton
GetBlock()204b9c1b51eSKate Stone SBBlock SBFunction::GetBlock() {
205*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
206baf5664fSJonas Devlieghere
2075569e64eSGreg Clayton SBBlock sb_block;
2085569e64eSGreg Clayton if (m_opaque_ptr)
2095569e64eSGreg Clayton sb_block.SetPtr(&m_opaque_ptr->GetBlock(true));
210d232abc3SJonas Devlieghere return sb_block;
2115569e64eSGreg Clayton }
2125569e64eSGreg Clayton
GetLanguage()213b9c1b51eSKate Stone lldb::LanguageType SBFunction::GetLanguage() {
214*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
215baf5664fSJonas Devlieghere
216b9c1b51eSKate Stone if (m_opaque_ptr) {
2176cd8e0c9SEnrico Granata if (m_opaque_ptr->GetCompileUnit())
2186cd8e0c9SEnrico Granata return m_opaque_ptr->GetCompileUnit()->GetLanguage();
2196cd8e0c9SEnrico Granata }
2206cd8e0c9SEnrico Granata return lldb::eLanguageTypeUnknown;
2216cd8e0c9SEnrico Granata }
2225569e64eSGreg Clayton
GetIsOptimized()223b9c1b51eSKate Stone bool SBFunction::GetIsOptimized() {
224*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
225baf5664fSJonas Devlieghere
226b9c1b51eSKate Stone if (m_opaque_ptr) {
2276ab659a9SJason Molenda if (m_opaque_ptr->GetCompileUnit())
2286ab659a9SJason Molenda return m_opaque_ptr->GetCompileUnit()->GetIsOptimized();
2296ab659a9SJason Molenda }
2306ab659a9SJason Molenda return false;
2316ab659a9SJason Molenda }
232