1419d7918SEnrico Granata //===-- CXXFormatterFunctions.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 10*c6bbb8b6SEnrico Granata #include "lldb/DataFormatters/CXXFunctionPointer.h" 11*c6bbb8b6SEnrico Granata 12419d7918SEnrico Granata #include "lldb/Target/SectionLoadList.h" 13419d7918SEnrico Granata #include "lldb/Target/Target.h" 14419d7918SEnrico Granata 15419d7918SEnrico Granata #include <string> 16419d7918SEnrico Granata 17419d7918SEnrico Granata using namespace lldb; 18419d7918SEnrico Granata using namespace lldb_private; 19419d7918SEnrico Granata using namespace lldb_private::formatters; 20419d7918SEnrico Granata 21419d7918SEnrico Granata bool 22419d7918SEnrico Granata lldb_private::formatters::CXXFunctionPointerSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) 23419d7918SEnrico Granata { 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); 28419d7918SEnrico Granata if (func_ptr_address != 0 && func_ptr_address != LLDB_INVALID_ADDRESS) 29419d7918SEnrico Granata { 30419d7918SEnrico Granata switch (func_ptr_address_type) 31419d7918SEnrico Granata { 32419d7918SEnrico Granata case eAddressTypeInvalid: 33419d7918SEnrico Granata case eAddressTypeFile: 34419d7918SEnrico Granata case eAddressTypeHost: 35419d7918SEnrico Granata break; 36419d7918SEnrico Granata 37419d7918SEnrico Granata case eAddressTypeLoad: 38419d7918SEnrico Granata { 39419d7918SEnrico Granata ExecutionContext exe_ctx (valobj.GetExecutionContextRef()); 40419d7918SEnrico Granata 41419d7918SEnrico Granata Address so_addr; 42419d7918SEnrico Granata Target *target = exe_ctx.GetTargetPtr(); 43419d7918SEnrico Granata if (target && target->GetSectionLoadList().IsEmpty() == false) 44419d7918SEnrico Granata { 45419d7918SEnrico Granata if (target->GetSectionLoadList().ResolveLoadAddress(func_ptr_address, so_addr)) 46419d7918SEnrico Granata { 47419d7918SEnrico Granata so_addr.Dump (&sstr, 48419d7918SEnrico Granata exe_ctx.GetBestExecutionContextScope(), 49419d7918SEnrico Granata Address::DumpStyleResolvedDescription, 50419d7918SEnrico Granata Address::DumpStyleSectionNameOffset); 51419d7918SEnrico Granata } 52419d7918SEnrico Granata } 53419d7918SEnrico Granata } 54419d7918SEnrico Granata break; 55419d7918SEnrico Granata } 56419d7918SEnrico Granata } 57419d7918SEnrico Granata if (sstr.GetSize() > 0) 58419d7918SEnrico Granata { 59419d7918SEnrico Granata stream.Printf("(%s)", sstr.GetData()); 60419d7918SEnrico Granata return true; 61419d7918SEnrico Granata } 62419d7918SEnrico Granata else 63419d7918SEnrico Granata return false; 64419d7918SEnrico Granata } 65