blob: f197d68794e68a714a9e375a4d4faffd564fb68f [file] [log] [blame]
// Copyright 2020 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.
#ifndef SRC_DEVELOPER_DEBUG_ZXDB_SYMBOLS_DWARF_UNIT_H_
#define SRC_DEVELOPER_DEBUG_ZXDB_SYMBOLS_DWARF_UNIT_H_
#include <string>
#include "llvm/DebugInfo/DWARF/DWARFDebugLine.h"
#include "llvm/DebugInfo/DWARF/DWARFUnit.h"
#include "src/developer/debug/zxdb/symbols/arch.h"
#include "src/developer/debug/zxdb/symbols/symbol_context.h"
#include "src/lib/fxl/memory/ref_counted.h"
namespace zxdb {
class LineTable;
// Represents a DWARF unit in the binary file. The primary purpose of this class is to allow
// mocking the LLVM libraries. It corresponds to what we need from llvm::DWARFUnit and is consumed
// primarily by ModuleSymbolsImpl which provides the high-level symbol interface.
//
// This is the higher-level thing that contains the line tables and such for the unit. The specific
// DIE for the compilation unit is represented by the CompileUnit class.
class DwarfUnit : public fxl::RefCountedThreadSafe<DwarfUnit> {
public:
// Returns the DIE information, if possible, for the function covering the given absolute address.
// TODO(brettw) return something higher-level than a DWARFDie.
llvm::DWARFDie FunctionForAddress(const SymbolContext& symbol_context,
TargetPointer absolute_address) const {
return FunctionForRelativeAddress(symbol_context.AbsoluteToRelative(absolute_address));
}
// Returns the DIE information, if possible, for the function covering the given relative address.
// TODO(brettw) return something higher-level than a DWARFDie.
virtual llvm::DWARFDie FunctionForRelativeAddress(uint64_t relative_address) const = 0;
// The compilation directory is what the compiler decides to write. In normal usage this will be
// an absolute directory on the current computer. In the Fuchsia in-tree build this will be
// relative.
virtual std::string GetCompilationDir() const = 0;
// The line table maps addresses to line numbers.
virtual const LineTable& GetLineTable() const = 0;
// Returns the internal LLVM line table. This will be null if there is no line table or there
// is no LLVM object backing this unit.
//
// TODO(brettw) this should be removed and all callers should use GetLineTable() so we don't have
// to expose the internal LLVM line table pointer. This would allow us to mock the whole line
// table for symbol tests.
//
// The reason this function is here is that some older code uses the LLVM because making our
// LineTable from LLVM's requires copying the table. This is nontrivial and we don't want to do
// every time this is called. Therefore, we'd want to cache it on a DwarfUnit. But to be useful
// the DwarfUnits must themselves be cached in the DwarfBinary whic does not happen yet.
virtual const llvm::DWARFDebugLine::LineTable* GetLLVMLineTable() const = 0;
protected:
FRIEND_REF_COUNTED_THREAD_SAFE(DwarfUnit);
virtual ~DwarfUnit() = default;
};
} // namespace zxdb
#endif // SRC_DEVELOPER_DEBUG_ZXDB_SYMBOLS_DWARF_UNIT_H_