1*0b57cec5SDimitry Andric //===-- CXXFunctionPointer.cpp---------------------------------------------===//
2*0b57cec5SDimitry Andric //
3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*0b57cec5SDimitry Andric //
7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
8*0b57cec5SDimitry Andric
9*0b57cec5SDimitry Andric #include "lldb/DataFormatters/CXXFunctionPointer.h"
10*0b57cec5SDimitry Andric
11*0b57cec5SDimitry Andric #include "lldb/Core/ValueObject.h"
12*0b57cec5SDimitry Andric #include "lldb/Target/SectionLoadList.h"
13*0b57cec5SDimitry Andric #include "lldb/Target/Target.h"
14*0b57cec5SDimitry Andric #include "lldb/Utility/Stream.h"
15*0b57cec5SDimitry Andric
16*0b57cec5SDimitry Andric #include <string>
17*0b57cec5SDimitry Andric
18*0b57cec5SDimitry Andric using namespace lldb;
19*0b57cec5SDimitry Andric using namespace lldb_private;
20*0b57cec5SDimitry Andric using namespace lldb_private::formatters;
21*0b57cec5SDimitry Andric
CXXFunctionPointerSummaryProvider(ValueObject & valobj,Stream & stream,const TypeSummaryOptions & options)22*0b57cec5SDimitry Andric bool lldb_private::formatters::CXXFunctionPointerSummaryProvider(
23*0b57cec5SDimitry Andric ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) {
24*0b57cec5SDimitry Andric std::string destination;
25*0b57cec5SDimitry Andric StreamString sstr;
26*0b57cec5SDimitry Andric AddressType func_ptr_address_type = eAddressTypeInvalid;
27*0b57cec5SDimitry Andric addr_t func_ptr_address = valobj.GetPointerValue(&func_ptr_address_type);
28*0b57cec5SDimitry Andric if (func_ptr_address != 0 && func_ptr_address != LLDB_INVALID_ADDRESS) {
29*0b57cec5SDimitry Andric switch (func_ptr_address_type) {
30*0b57cec5SDimitry Andric case eAddressTypeInvalid:
31*0b57cec5SDimitry Andric case eAddressTypeFile:
32*0b57cec5SDimitry Andric case eAddressTypeHost:
33*0b57cec5SDimitry Andric break;
34*0b57cec5SDimitry Andric
35*0b57cec5SDimitry Andric case eAddressTypeLoad: {
36*0b57cec5SDimitry Andric ExecutionContext exe_ctx(valobj.GetExecutionContextRef());
37*0b57cec5SDimitry Andric
38*0b57cec5SDimitry Andric Address so_addr;
39*0b57cec5SDimitry Andric Target *target = exe_ctx.GetTargetPtr();
40*0b57cec5SDimitry Andric if (target && !target->GetSectionLoadList().IsEmpty()) {
41*0b57cec5SDimitry Andric if (target->GetSectionLoadList().ResolveLoadAddress(func_ptr_address,
42*0b57cec5SDimitry Andric so_addr)) {
43*0b57cec5SDimitry Andric so_addr.Dump(&sstr, exe_ctx.GetBestExecutionContextScope(),
44*0b57cec5SDimitry Andric Address::DumpStyleResolvedDescription,
45*0b57cec5SDimitry Andric Address::DumpStyleSectionNameOffset);
46*0b57cec5SDimitry Andric }
47*0b57cec5SDimitry Andric }
48*0b57cec5SDimitry Andric } break;
49*0b57cec5SDimitry Andric }
50*0b57cec5SDimitry Andric }
51*0b57cec5SDimitry Andric if (sstr.GetSize() > 0) {
52*0b57cec5SDimitry Andric stream.Printf("(%s)", sstr.GetData());
53*0b57cec5SDimitry Andric return true;
54*0b57cec5SDimitry Andric } else
55*0b57cec5SDimitry Andric return false;
56*0b57cec5SDimitry Andric }
57