blob: c9e0ccb29698f33e56f74a17ac2b4b26869a99b0 [file] [log] [blame]
Enrico Granata419d7912015-09-04 00:33:51 +00001//===-- CXXFormatterFunctions.cpp---------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Enrico Granatac6bbb8b2015-09-04 21:22:54 +000010#include "lldb/DataFormatters/CXXFunctionPointer.h"
11
Enrico Granatad717cc92015-10-20 04:50:09 +000012#include "lldb/Core/Stream.h"
13#include "lldb/Core/ValueObject.h"
Enrico Granata419d7912015-09-04 00:33:51 +000014#include "lldb/Target/SectionLoadList.h"
15#include "lldb/Target/Target.h"
16
17#include <string>
18
19using namespace lldb;
20using namespace lldb_private;
21using namespace lldb_private::formatters;
22
23bool
24lldb_private::formatters::CXXFunctionPointerSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options)
25{
26 std::string destination;
27 StreamString sstr;
28 AddressType func_ptr_address_type = eAddressTypeInvalid;
29 addr_t func_ptr_address = valobj.GetPointerValue (&func_ptr_address_type);
30 if (func_ptr_address != 0 && func_ptr_address != LLDB_INVALID_ADDRESS)
31 {
32 switch (func_ptr_address_type)
33 {
34 case eAddressTypeInvalid:
35 case eAddressTypeFile:
36 case eAddressTypeHost:
37 break;
38
39 case eAddressTypeLoad:
40 {
41 ExecutionContext exe_ctx (valobj.GetExecutionContextRef());
42
43 Address so_addr;
44 Target *target = exe_ctx.GetTargetPtr();
45 if (target && target->GetSectionLoadList().IsEmpty() == false)
46 {
47 if (target->GetSectionLoadList().ResolveLoadAddress(func_ptr_address, so_addr))
48 {
49 so_addr.Dump (&sstr,
50 exe_ctx.GetBestExecutionContextScope(),
51 Address::DumpStyleResolvedDescription,
52 Address::DumpStyleSectionNameOffset);
53 }
54 }
55 }
56 break;
57 }
58 }
59 if (sstr.GetSize() > 0)
60 {
61 stream.Printf("(%s)", sstr.GetData());
62 return true;
63 }
64 else
65 return false;
66}