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