//===-- CXXFormatterFunctions.cpp---------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#include "lldb/DataFormatters/CXXFunctionPointer.h"

#include "lldb/Core/Stream.h"
#include "lldb/Core/ValueObject.h"
#include "lldb/Target/SectionLoadList.h"
#include "lldb/Target/Target.h"

#include <string>

using namespace lldb;
using namespace lldb_private;
using namespace lldb_private::formatters;

bool
lldb_private::formatters::CXXFunctionPointerSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options)
{
    std::string destination;
    StreamString sstr;
    AddressType func_ptr_address_type = eAddressTypeInvalid;
    addr_t func_ptr_address = valobj.GetPointerValue (&func_ptr_address_type);
    if (func_ptr_address != 0 && func_ptr_address != LLDB_INVALID_ADDRESS)
    {
        switch (func_ptr_address_type)
        {
            case eAddressTypeInvalid:
            case eAddressTypeFile:
            case eAddressTypeHost:
                break;
                
            case eAddressTypeLoad:
            {
                ExecutionContext exe_ctx (valobj.GetExecutionContextRef());
                
                Address so_addr;
                Target *target = exe_ctx.GetTargetPtr();
                if (target && target->GetSectionLoadList().IsEmpty() == false)
                {
                    if (target->GetSectionLoadList().ResolveLoadAddress(func_ptr_address, so_addr))
                    {
                        so_addr.Dump (&sstr,
                                      exe_ctx.GetBestExecutionContextScope(),
                                      Address::DumpStyleResolvedDescription,
                                      Address::DumpStyleSectionNameOffset);
                    }
                }
            }
                break;
        }
    }
    if (sstr.GetSize() > 0)
    {
        stream.Printf("(%s)", sstr.GetData());
        return true;
    }
    else
        return false;
}
