| //===- AddressesMap.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 LLVM_DWARFLINKERPARALLEL_ADDRESSESMAP_H |
| #define LLVM_DWARFLINKERPARALLEL_ADDRESSESMAP_H |
| |
| #include "llvm/ADT/AddressRanges.h" |
| #include "llvm/DebugInfo/DWARF/DWARFDie.h" |
| #include <cstdint> |
| |
| namespace llvm { |
| namespace dwarflinker_parallel { |
| |
| /// Mapped value in the address map is the offset to apply to the |
| /// linked address. |
| using RangesTy = AddressRangesMap; |
| |
| /// AddressesMap represents information about valid addresses used |
| /// by debug information. Valid addresses are those which points to |
| /// live code sections. i.e. relocations for these addresses point |
| /// into sections which would be/are placed into resulting binary. |
| class AddressesMap { |
| public: |
| virtual ~AddressesMap() = default; |
| |
| /// Checks that there are valid relocations in the .debug_info |
| /// section. |
| virtual bool hasValidRelocs() = 0; |
| |
| /// Checks that the specified variable \p DIE references the live code |
| /// section and returns the relocation adjustment value (to get the linked |
| /// address this value might be added to the source variable address). |
| /// Allowed kinds of input DIE: DW_TAG_variable, DW_TAG_constant. |
| /// \returns relocation adjustment value or std::nullopt if there is no |
| /// corresponding live address. |
| virtual std::optional<int64_t> |
| getVariableRelocAdjustment(const DWARFDie &DIE) = 0; |
| |
| /// Checks that the specified subprogram \p DIE references the live code |
| /// section and returns the relocation adjustment value (to get the linked |
| /// address this value might be added to the source subprogram address). |
| /// Allowed kinds of input DIE: DW_TAG_subprogram, DW_TAG_label. |
| /// \returns relocation adjustment value or std::nullopt if there is no |
| /// corresponding live address. |
| virtual std::optional<int64_t> |
| getSubprogramRelocAdjustment(const DWARFDie &DIE) = 0; |
| |
| /// Apply the valid relocations to the buffer \p Data, taking into |
| /// account that Data is at \p BaseOffset in the .debug_info section. |
| /// |
| /// \returns true whether any reloc has been applied. |
| virtual bool applyValidRelocs(MutableArrayRef<char> Data, uint64_t BaseOffset, |
| bool IsLittleEndian) = 0; |
| |
| /// Returns all valid functions address ranges (i.e., those ranges |
| /// which points to sections with code). |
| virtual RangesTy &getValidAddressRanges() = 0; |
| |
| /// Erases all data. |
| virtual void clear() = 0; |
| }; |
| |
| } // end of namespace dwarflinker_parallel |
| } // end namespace llvm |
| |
| #endif // LLVM_DWARFLINKERPARALLEL_ADDRESSESMAP_H |