// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "garnet/bin/zxdb/symbols/line_table_impl.h"

#include "llvm/DebugInfo/DWARF/DWARFContext.h"

namespace zxdb {

LineTableImpl::LineTableImpl(llvm::DWARFContext* context, llvm::DWARFUnit* unit)
    : unit_(unit),
      compilation_dir_(unit->getCompilationDir()),
      line_table_(context->getLineTableForUnit(unit)) {}

LineTableImpl::~LineTableImpl() = default;

size_t LineTableImpl::GetNumFileNames() const {
  return line_table_->Prologue.FileNames.size();
}

const std::vector<llvm::DWARFDebugLine::Row>& LineTableImpl::GetRows() const {
  return line_table_->Rows;
}

std::optional<std::string> LineTableImpl::GetFileNameByIndex(
    uint64_t file_id) const {
  std::string result;
  if (line_table_->getFileNameByIndex(
          file_id, compilation_dir_,
          llvm::DILineInfoSpecifier::FileLineInfoKind::AbsoluteFilePath,
          result))
    return std::optional<std::string>(std::move(result));
  return std::nullopt;
}

llvm::DWARFDie LineTableImpl::GetSubroutineForRow(
    const llvm::DWARFDebugLine::Row& row) const {
  return unit_->getSubroutineForAddress(row.Address);
}

}  // namespace zxdb
