| //===- DWARFVerifier.h ----------------------------------------------------===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_DEBUGINFO_DWARF_DWARFVERIFIER_H |
| #define LLVM_DEBUGINFO_DWARF_DWARFVERIFIER_H |
| |
| #include <cstdint> |
| #include <map> |
| #include <set> |
| |
| namespace llvm { |
| class raw_ostream; |
| struct DWARFAttribute; |
| class DWARFContext; |
| class DWARFDie; |
| class DWARFUnit; |
| class DWARFAcceleratorTable; |
| |
| /// A class that verifies DWARF debug information given a DWARF Context. |
| class DWARFVerifier { |
| raw_ostream &OS; |
| DWARFContext &DCtx; |
| /// A map that tracks all references (converted absolute references) so we |
| /// can verify each reference points to a valid DIE and not an offset that |
| /// lies between to valid DIEs. |
| std::map<uint64_t, std::set<uint32_t>> ReferenceToDIEOffsets; |
| uint32_t NumDebugInfoErrors = 0; |
| uint32_t NumDebugLineErrors = 0; |
| uint32_t NumAppleNamesErrors = 0; |
| |
| /// Verifies the attribute's DWARF attribute and its value. |
| /// |
| /// This function currently checks for: |
| /// - DW_AT_ranges values is a valid .debug_ranges offset |
| /// - DW_AT_stmt_list is a valid .debug_line offset |
| /// |
| /// \param Die The DWARF DIE that owns the attribute value |
| /// \param AttrValue The DWARF attribute value to check |
| void verifyDebugInfoAttribute(const DWARFDie &Die, DWARFAttribute &AttrValue); |
| |
| /// Verifies the attribute's DWARF form. |
| /// |
| /// This function currently checks for: |
| /// - All DW_FORM_ref values that are CU relative have valid CU offsets |
| /// - All DW_FORM_ref_addr values have valid .debug_info offsets |
| /// - All DW_FORM_strp values have valid .debug_str offsets |
| /// |
| /// \param Die The DWARF DIE that owns the attribute value |
| /// \param AttrValue The DWARF attribute value to check |
| void verifyDebugInfoForm(const DWARFDie &Die, DWARFAttribute &AttrValue); |
| |
| /// Verifies the all valid references that were found when iterating through |
| /// all of the DIE attributes. |
| /// |
| /// This function will verify that all references point to DIEs whose DIE |
| /// offset matches. This helps to ensure if a DWARF link phase moved things |
| /// around, that it doesn't create invalid references by failing to relocate |
| /// CU relative and absolute references. |
| void verifyDebugInfoReferences(); |
| |
| /// Verify the the DW_AT_stmt_list encoding and value and ensure that no |
| /// compile units that have the same DW_AT_stmt_list value. |
| void verifyDebugLineStmtOffsets(); |
| |
| /// Verify that all of the rows in the line table are valid. |
| /// |
| /// This function currently checks for: |
| /// - addresses within a sequence that decrease in value |
| /// - invalid file indexes |
| void verifyDebugLineRows(); |
| |
| public: |
| DWARFVerifier(raw_ostream &S, DWARFContext &D) |
| : OS(S), DCtx(D) {} |
| /// Verify the information in the .debug_info section. |
| /// |
| /// Any errors are reported to the stream that was this object was |
| /// constructed with. |
| /// |
| /// \returns true if the .debug_info verifies successfully, false otherwise. |
| bool handleDebugInfo(); |
| |
| /// Verify the information in the .debug_line section. |
| /// |
| /// Any errors are reported to the stream that was this object was |
| /// constructed with. |
| /// |
| /// \returns true if the .debug_line verifies successfully, false otherwise. |
| bool handleDebugLine(); |
| |
| /// Verify the information in the .apple_names accelerator table. |
| /// |
| /// Any errors are reported to the stream that was this object was |
| /// constructed with. |
| /// |
| /// \returns true if the .apple_names verifies successfully, false otherwise. |
| bool handleAppleNames(); |
| }; |
| |
| } // end namespace llvm |
| |
| #endif // LLVM_DEBUGINFO_DWARF_DWARFCONTEXT_H |