root/src/kits/debugger/debug_info/DwarfFunctionDebugInfo.cpp
/*
 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
 * Distributed under the terms of the MIT License.
 */

#include "DwarfFunctionDebugInfo.h"

#include "DebugInfoEntries.h"
#include "DwarfImageDebugInfo.h"
#include "LocatableFile.h"
#include "TargetAddressRangeList.h"


DwarfFunctionDebugInfo::DwarfFunctionDebugInfo(
        DwarfImageDebugInfo* imageDebugInfo, CompilationUnit* compilationUnit,
        DIESubprogram* subprogramEntry, TargetAddressRangeList* addressRanges,
        const BString& name, LocatableFile* sourceFile,
        const SourceLocation& sourceLocation)
        :
        fImageDebugInfo(imageDebugInfo),
        fCompilationUnit(compilationUnit),
        fSubprogramEntry(subprogramEntry),
        fAddressRanges(addressRanges),
        fName(name),
        fSourceFile(sourceFile),
        fSourceLocation(sourceLocation)
{
        fImageDebugInfo->AcquireReference();
        fAddressRanges->AcquireReference();

        if (fSourceFile != NULL)
                fSourceFile->AcquireReference();
}


DwarfFunctionDebugInfo::~DwarfFunctionDebugInfo()
{
        if (fSourceFile != NULL)
                fSourceFile->ReleaseReference();

        fAddressRanges->ReleaseReference();
        fImageDebugInfo->ReleaseReference();
}


SpecificImageDebugInfo*
DwarfFunctionDebugInfo::GetSpecificImageDebugInfo() const
{
        return fImageDebugInfo;
}


target_addr_t
DwarfFunctionDebugInfo::Address() const
{
        return fAddressRanges->LowestAddress() + fImageDebugInfo->RelocationDelta();
}


target_size_t
DwarfFunctionDebugInfo::Size() const
{
        return fAddressRanges->CoveringRange().Size();
}


const BString&
DwarfFunctionDebugInfo::Name() const
{
        return fName;
}


const BString&
DwarfFunctionDebugInfo::PrettyName() const
{
        return fName;
}


bool
DwarfFunctionDebugInfo::IsMain() const
{
        return fSubprogramEntry->IsMain();
}


LocatableFile*
DwarfFunctionDebugInfo::SourceFile() const
{
        return fSourceFile;
}


SourceLocation
DwarfFunctionDebugInfo::SourceStartLocation() const
{
        return fSourceLocation;
}


SourceLocation
DwarfFunctionDebugInfo::SourceEndLocation() const
{
        return fSourceLocation;
}