blob: 8da59cf0bd24aa090ce04e9116bc9397e08b4240 [file] [log] [blame]
//===-- LineEntry.h ---------------------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#ifndef LLDB_SYMBOL_LINEENTRY_H
#define LLDB_SYMBOL_LINEENTRY_H
#include "lldb/Core/AddressRange.h"
#include "lldb/Utility/FileSpec.h"
#include "lldb/Utility/SupportFile.h"
#include "lldb/lldb-private.h"
namespace lldb_private {
/// \class LineEntry LineEntry.h "lldb/Symbol/LineEntry.h"
/// A line table entry class.
struct LineEntry {
/// Default constructor.
///
/// Initialize all member variables to invalid values.
LineEntry();
/// Clear the object's state.
///
/// Clears all member variables to invalid values.
void Clear();
/// Dump a description of this object to a Stream.
///
/// Dump a description of the contents of this object to the supplied stream
/// \a s.
///
/// \param[in] s
/// The stream to which to dump the object description.
///
/// \param[in] show_file
/// If \b true, display the filename with the line entry which
/// requires that the compile unit object \a comp_unit be a
/// valid pointer.
///
/// \param[in] style
/// The display style for the section offset address.
///
/// \return
/// Returns \b true if the address was able to be displayed
/// using \a style. File and load addresses may be unresolved
/// and it may not be possible to display a valid address value.
/// Returns \b false if the address was not able to be properly
/// dumped.
///
/// \see Address::DumpStyle
bool Dump(Stream *s, Target *target, bool show_file, Address::DumpStyle style,
Address::DumpStyle fallback_style, bool show_range) const;
bool GetDescription(Stream *s, lldb::DescriptionLevel level, CompileUnit *cu,
Target *target, bool show_address_only) const;
/// Dumps information specific to a process that stops at this line entry to
/// the supplied stream \a s.
///
/// \param[in] s
/// The stream to which to dump the object description.
///
/// \return
/// Returns \b true if the file and line were properly dumped,
/// \b false otherwise.
bool DumpStopContext(Stream *s, bool show_fullpaths) const;
/// Check if a line entry object is valid.
///
/// \return
/// Returns \b true if the line entry contains a valid section
/// offset address, file index, and line number, \b false
/// otherwise.
bool IsValid() const;
/// Compare two LineEntry objects.
///
/// \param[in] lhs
/// The Left Hand Side const LineEntry object reference.
///
/// \param[in] rhs
/// The Right Hand Side const LineEntry object reference.
///
/// \return
/// -1 if lhs < rhs
/// 0 if lhs == rhs
/// 1 if lhs > rhs
static int Compare(const LineEntry &lhs, const LineEntry &rhs);
/// Give the range for this LineEntry + any additional LineEntries for this
/// same source line that are contiguous.
///
/// A compiler may emit multiple line entries for a single source line,
/// e.g. to indicate subexpressions at different columns. This method will
/// get the AddressRange for all of the LineEntries for this source line
/// that are contiguous.
//
/// Line entries with a line number of 0 are treated specially - these are
/// compiler-generated line table entries that the user did not write in
/// their source code, and we want to skip past in the debugger. If this
/// LineEntry is for line 32, and the following LineEntry is for line 0, we
/// will extend the range to include the AddressRange of the line 0
/// LineEntry (and it will include the range of the following LineEntries
/// that match either 32 or 0.)
///
/// When \b include_inlined_functions is \b true inlined functions with
/// a call site at this LineEntry will also be included in the complete
/// range.
///
/// If the initial LineEntry this method is called on is a line #0, only the
/// range of continuous LineEntries with line #0 will be included in the
/// complete range.
///
/// @param[in] include_inlined_functions
/// Whether to include inlined functions at the same line or not.
///
/// \return
/// The contiguous AddressRange for this source line.
AddressRange
GetSameLineContiguousAddressRange(bool include_inlined_functions) const;
/// Apply file mappings from target.source-map to the LineEntry's file.
///
/// \param[in] target_sp
/// Shared pointer to the target this LineEntry belongs to.
void ApplyFileMappings(lldb::TargetSP target_sp);
/// Helper to access the file.
const FileSpec &GetFile() const { return file_sp->GetSpecOnly(); }
/// The section offset address range for this line entry.
AddressRange range;
/// The source file, possibly mapped by the target.source-map setting.
lldb::SupportFileSP file_sp;
/// The original source file, from debug info.
lldb::SupportFileSP original_file_sp;
/// The source line number, or LLDB_INVALID_LINE_NUMBER if there is no line
/// number information.
uint32_t line = LLDB_INVALID_LINE_NUMBER;
/// The column number of the source line, or zero if there is no column
/// information.
uint16_t column = 0;
/// Indicates this entry is the beginning of a statement.
uint16_t is_start_of_statement : 1;
/// Indicates this entry is the beginning of a basic block.
uint16_t is_start_of_basic_block : 1;
/// Indicates this entry is one (of possibly many) where execution should be
/// suspended for an entry breakpoint of a function.
uint16_t is_prologue_end : 1;
/// Indicates this entry is one (of possibly many) where execution should be
/// suspended for an exit breakpoint of a function.
uint16_t is_epilogue_begin : 1;
/// Indicates this entry is that of the first byte after the end of a sequence
/// of target machine instructions.
uint16_t is_terminal_entry : 1;
};
/// Less than operator.
///
/// \param[in] lhs
/// The Left Hand Side const LineEntry object reference.
///
/// \param[in] rhs
/// The Right Hand Side const LineEntry object reference.
///
/// \return
/// Returns \b true if lhs < rhs, false otherwise.
bool operator<(const LineEntry &lhs, const LineEntry &rhs);
} // namespace lldb_private
#endif // LLDB_SYMBOL_LINEENTRY_H