1*696bd635SAlexander Shaposhnikov //===-- CXXFunctionPointer.cpp-----------------------------------*- C++ -*-===// 2419d7918SEnrico Granata // 3419d7918SEnrico Granata // The LLVM Compiler Infrastructure 4419d7918SEnrico Granata // 5419d7918SEnrico Granata // This file is distributed under the University of Illinois Open Source 6419d7918SEnrico Granata // License. See LICENSE.TXT for details. 7419d7918SEnrico Granata // 8419d7918SEnrico Granata //===----------------------------------------------------------------------===// 9419d7918SEnrico Granata 10c6bbb8b6SEnrico Granata #include "lldb/DataFormatters/CXXFunctionPointer.h" 11c6bbb8b6SEnrico Granata 12d717cc9fSEnrico Granata #include "lldb/Core/Stream.h" 13d717cc9fSEnrico Granata #include "lldb/Core/ValueObject.h" 14419d7918SEnrico Granata #include "lldb/Target/SectionLoadList.h" 15419d7918SEnrico Granata #include "lldb/Target/Target.h" 16419d7918SEnrico Granata 17419d7918SEnrico Granata #include <string> 18419d7918SEnrico Granata 19419d7918SEnrico Granata using namespace lldb; 20419d7918SEnrico Granata using namespace lldb_private; 21419d7918SEnrico Granata using namespace lldb_private::formatters; 22419d7918SEnrico Granata 23b9c1b51eSKate Stone bool lldb_private::formatters::CXXFunctionPointerSummaryProvider( 24b9c1b51eSKate Stone ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { 25419d7918SEnrico Granata std::string destination; 26419d7918SEnrico Granata StreamString sstr; 27419d7918SEnrico Granata AddressType func_ptr_address_type = eAddressTypeInvalid; 28419d7918SEnrico Granata addr_t func_ptr_address = valobj.GetPointerValue(&func_ptr_address_type); 29b9c1b51eSKate Stone if (func_ptr_address != 0 && func_ptr_address != LLDB_INVALID_ADDRESS) { 30b9c1b51eSKate Stone switch (func_ptr_address_type) { 31419d7918SEnrico Granata case eAddressTypeInvalid: 32419d7918SEnrico Granata case eAddressTypeFile: 33419d7918SEnrico Granata case eAddressTypeHost: 34419d7918SEnrico Granata break; 35419d7918SEnrico Granata 36b9c1b51eSKate Stone case eAddressTypeLoad: { 37419d7918SEnrico Granata ExecutionContext exe_ctx(valobj.GetExecutionContextRef()); 38419d7918SEnrico Granata 39419d7918SEnrico Granata Address so_addr; 40419d7918SEnrico Granata Target *target = exe_ctx.GetTargetPtr(); 41b9c1b51eSKate Stone if (target && target->GetSectionLoadList().IsEmpty() == false) { 42b9c1b51eSKate Stone if (target->GetSectionLoadList().ResolveLoadAddress(func_ptr_address, 43b9c1b51eSKate Stone so_addr)) { 44b9c1b51eSKate Stone so_addr.Dump(&sstr, exe_ctx.GetBestExecutionContextScope(), 45419d7918SEnrico Granata Address::DumpStyleResolvedDescription, 46419d7918SEnrico Granata Address::DumpStyleSectionNameOffset); 47419d7918SEnrico Granata } 48419d7918SEnrico Granata } 49b9c1b51eSKate Stone } break; 50419d7918SEnrico Granata } 51419d7918SEnrico Granata } 52b9c1b51eSKate Stone if (sstr.GetSize() > 0) { 53419d7918SEnrico Granata stream.Printf("(%s)", sstr.GetData()); 54419d7918SEnrico Granata return true; 55b9c1b51eSKate Stone } else 56419d7918SEnrico Granata return false; 57419d7918SEnrico Granata } 58