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