1696bd635SAlexander Shaposhnikov //===-- CXXFunctionPointer.cpp-----------------------------------*- C++ -*-===//
2419d7918SEnrico Granata //
3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6419d7918SEnrico Granata //
7419d7918SEnrico Granata //===----------------------------------------------------------------------===//
8419d7918SEnrico Granata 
9c6bbb8b6SEnrico Granata #include "lldb/DataFormatters/CXXFunctionPointer.h"
10c6bbb8b6SEnrico Granata 
11d717cc9fSEnrico Granata #include "lldb/Core/ValueObject.h"
12419d7918SEnrico Granata #include "lldb/Target/SectionLoadList.h"
13419d7918SEnrico Granata #include "lldb/Target/Target.h"
14bf9a7730SZachary Turner #include "lldb/Utility/Stream.h"
15419d7918SEnrico Granata 
16419d7918SEnrico Granata #include <string>
17419d7918SEnrico Granata 
18419d7918SEnrico Granata using namespace lldb;
19419d7918SEnrico Granata using namespace lldb_private;
20419d7918SEnrico Granata using namespace lldb_private::formatters;
21419d7918SEnrico Granata 
22b9c1b51eSKate Stone bool lldb_private::formatters::CXXFunctionPointerSummaryProvider(
23b9c1b51eSKate Stone     ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) {
24419d7918SEnrico Granata   std::string destination;
25419d7918SEnrico Granata   StreamString sstr;
26419d7918SEnrico Granata   AddressType func_ptr_address_type = eAddressTypeInvalid;
27419d7918SEnrico Granata   addr_t func_ptr_address = valobj.GetPointerValue(&func_ptr_address_type);
28b9c1b51eSKate Stone   if (func_ptr_address != 0 && func_ptr_address != LLDB_INVALID_ADDRESS) {
29b9c1b51eSKate Stone     switch (func_ptr_address_type) {
30419d7918SEnrico Granata     case eAddressTypeInvalid:
31419d7918SEnrico Granata     case eAddressTypeFile:
32419d7918SEnrico Granata     case eAddressTypeHost:
33419d7918SEnrico Granata       break;
34419d7918SEnrico Granata 
35b9c1b51eSKate Stone     case eAddressTypeLoad: {
36419d7918SEnrico Granata       ExecutionContext exe_ctx(valobj.GetExecutionContextRef());
37419d7918SEnrico Granata 
38419d7918SEnrico Granata       Address so_addr;
39419d7918SEnrico Granata       Target *target = exe_ctx.GetTargetPtr();
40a6682a41SJonas Devlieghere       if (target && !target->GetSectionLoadList().IsEmpty()) {
41b9c1b51eSKate Stone         if (target->GetSectionLoadList().ResolveLoadAddress(func_ptr_address,
42b9c1b51eSKate Stone                                                             so_addr)) {
43b9c1b51eSKate Stone           so_addr.Dump(&sstr, exe_ctx.GetBestExecutionContextScope(),
44419d7918SEnrico Granata                        Address::DumpStyleResolvedDescription,
45419d7918SEnrico Granata                        Address::DumpStyleSectionNameOffset);
46419d7918SEnrico Granata         }
47419d7918SEnrico Granata       }
48b9c1b51eSKate Stone     } break;
49419d7918SEnrico Granata     }
50419d7918SEnrico Granata   }
51b9c1b51eSKate Stone   if (sstr.GetSize() > 0) {
52419d7918SEnrico Granata     stream.Printf("(%s)", sstr.GetData());
53419d7918SEnrico Granata     return true;
54b9c1b51eSKate Stone   } else
55419d7918SEnrico Granata     return false;
56419d7918SEnrico Granata }
57