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

#include "llvm/DebugInfo/PDB/DIA/DIARawSymbol.h"
#include "llvm/DebugInfo/PDB/DIA/DIASectionContrib.h"
#include "llvm/DebugInfo/PDB/DIA/DIASession.h"
#include "llvm/DebugInfo/PDB/PDBSymbolCompiland.h"

using namespace llvm;
using namespace llvm::pdb;

DIASectionContrib::DIASectionContrib(const DIASession &PDBSession,
                                     CComPtr<IDiaSectionContrib> DiaSection)
  : Session(PDBSession), Section(DiaSection) {}

std::unique_ptr<PDBSymbolCompiland> DIASectionContrib::getCompiland() const {
  CComPtr<IDiaSymbol> Symbol;
  if (FAILED(Section->get_compiland(&Symbol)))
    return nullptr;

  auto RawSymbol = llvm::make_unique<DIARawSymbol>(Session, Symbol);
  return llvm::make_unique<PDBSymbolCompiland>(Session, std::move(RawSymbol));
}

template <typename ArgType>
ArgType PrivateGetDIAValue(
    IDiaSectionContrib *Section,
    HRESULT(__stdcall IDiaSectionContrib::*Method)(ArgType *)) {
  ArgType Value;
  if (S_OK == (Section->*Method)(&Value))
    return static_cast<ArgType>(Value);

  return ArgType();
}

template <typename ArgType, typename RetType>
RetType PrivateGetDIAValue(
    IDiaSectionContrib *Section,
    HRESULT(__stdcall IDiaSectionContrib::*Method)(ArgType *)) {
  ArgType Value;
  if (S_OK == (Section->*Method)(&Value))
    return static_cast<RetType>(Value);

  return RetType();
}

uint32_t DIASectionContrib::getAddressSection() const {
  return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_addressSection);
}

uint32_t DIASectionContrib::getAddressOffset() const {
  return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_addressOffset);
}

uint64_t DIASectionContrib::getVirtualAddress() const {
  return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_virtualAddress);
}

uint32_t DIASectionContrib::getRelativeVirtualAddress() const {
  return PrivateGetDIAValue(Section,
                            &IDiaSectionContrib::get_relativeVirtualAddress);
}
uint32_t DIASectionContrib::getLength() const {
  return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_length);
}

bool DIASectionContrib::isNotPaged() const {
  return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_notPaged);
}

bool DIASectionContrib::hasCode() const {
  return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_code);
}

bool DIASectionContrib::hasCode16Bit() const {
  return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_code16bit);
}

bool DIASectionContrib::hasInitializedData() const {
  return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_initializedData);
}

bool DIASectionContrib::hasUninitializedData() const {
  return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_uninitializedData);
}

bool DIASectionContrib::isRemoved() const {
  return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_remove);
}

bool DIASectionContrib::hasComdat() const {
  return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_comdat);
}

bool DIASectionContrib::isDiscardable() const {
  return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_discardable);
}

bool DIASectionContrib::isNotCached() const {
  return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_notCached);
}

bool DIASectionContrib::isShared() const {
  return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_share);
}

bool DIASectionContrib::isExecutable() const {
  return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_execute);
}

bool DIASectionContrib::isReadable() const {
  return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_read);
}

bool DIASectionContrib::isWritable() const {
  return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_write);
}

uint32_t DIASectionContrib::getDataCrc32() const {
  return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_dataCrc);
}

uint32_t DIASectionContrib::getRelocationsCrc32() const {
  return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_relocationsCrc);
}

uint32_t DIASectionContrib::getCompilandId() const {
  return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_compilandId);
}
