]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm-project/lldb/source/DataFormatters/CXXFunctionPointer.cpp
Merge llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp
[FreeBSD/FreeBSD.git] / contrib / llvm-project / lldb / source / DataFormatters / CXXFunctionPointer.cpp
1 //===-- CXXFunctionPointer.cpp-----------------------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8
9 #include "lldb/DataFormatters/CXXFunctionPointer.h"
10
11 #include "lldb/Core/ValueObject.h"
12 #include "lldb/Target/SectionLoadList.h"
13 #include "lldb/Target/Target.h"
14 #include "lldb/Utility/Stream.h"
15
16 #include <string>
17
18 using namespace lldb;
19 using namespace lldb_private;
20 using namespace lldb_private::formatters;
21
22 bool lldb_private::formatters::CXXFunctionPointerSummaryProvider(
23     ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) {
24   std::string destination;
25   StreamString sstr;
26   AddressType func_ptr_address_type = eAddressTypeInvalid;
27   addr_t func_ptr_address = valobj.GetPointerValue(&func_ptr_address_type);
28   if (func_ptr_address != 0 && func_ptr_address != LLDB_INVALID_ADDRESS) {
29     switch (func_ptr_address_type) {
30     case eAddressTypeInvalid:
31     case eAddressTypeFile:
32     case eAddressTypeHost:
33       break;
34
35     case eAddressTypeLoad: {
36       ExecutionContext exe_ctx(valobj.GetExecutionContextRef());
37
38       Address so_addr;
39       Target *target = exe_ctx.GetTargetPtr();
40       if (target && !target->GetSectionLoadList().IsEmpty()) {
41         if (target->GetSectionLoadList().ResolveLoadAddress(func_ptr_address,
42                                                             so_addr)) {
43           so_addr.Dump(&sstr, exe_ctx.GetBestExecutionContextScope(),
44                        Address::DumpStyleResolvedDescription,
45                        Address::DumpStyleSectionNameOffset);
46         }
47       }
48     } break;
49     }
50   }
51   if (sstr.GetSize() > 0) {
52     stream.Printf("(%s)", sstr.GetData());
53     return true;
54   } else
55     return false;
56 }