| 1 | //===- bolt/Target/AArch64/AArch64MCSymbolizer.cpp --------------*- C++ -*-===// |
| 2 | // |
| 3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| 4 | // See https://llvm.org/LICENSE.txt for license information. |
| 5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| 6 | // |
| 7 | //===----------------------------------------------------------------------===// |
| 8 | |
| 9 | #ifndef BOLT_TARGET_AARCH64_AARCH64MCSYMBOLIZER_H |
| 10 | #define BOLT_TARGET_AARCH64_AARCH64MCSYMBOLIZER_H |
| 11 | |
| 12 | #include "bolt/Core/BinaryFunction.h" |
| 13 | #include "llvm/MC/MCDisassembler/MCSymbolizer.h" |
| 14 | #include <optional> |
| 15 | |
| 16 | namespace llvm { |
| 17 | namespace bolt { |
| 18 | |
| 19 | class AArch64MCSymbolizer : public MCSymbolizer { |
| 20 | protected: |
| 21 | BinaryFunction &Function; |
| 22 | bool CreateNewSymbols{true}; |
| 23 | |
| 24 | /// Modify relocation \p Rel based on type of the relocation and the |
| 25 | /// instruction it was applied to. Return the new relocation info, or |
| 26 | /// std::nullopt if the relocation should be ignored, e.g. in the case the |
| 27 | /// instruction was modified by the linker. |
| 28 | std::optional<Relocation> adjustRelocation(const Relocation &Rel, |
| 29 | const MCInst &Inst) const; |
| 30 | |
| 31 | /// Return true if \p PageAddress is a valid page address for .got section. |
| 32 | bool isPageAddressValidForGOT(uint64_t PageAddress) const; |
| 33 | |
| 34 | public: |
| 35 | AArch64MCSymbolizer(BinaryFunction &Function, bool CreateNewSymbols = true) |
| 36 | : MCSymbolizer(*Function.getBinaryContext().Ctx, nullptr), |
| 37 | Function(Function), CreateNewSymbols(CreateNewSymbols) {} |
| 38 | |
| 39 | AArch64MCSymbolizer(const AArch64MCSymbolizer &) = delete; |
| 40 | AArch64MCSymbolizer &operator=(const AArch64MCSymbolizer &) = delete; |
| 41 | virtual ~AArch64MCSymbolizer(); |
| 42 | |
| 43 | bool tryAddingSymbolicOperand(MCInst &Inst, raw_ostream &CStream, |
| 44 | int64_t Value, uint64_t Address, bool IsBranch, |
| 45 | uint64_t Offset, uint64_t OpSize, |
| 46 | uint64_t InstSize) override; |
| 47 | |
| 48 | void (raw_ostream &CStream, int64_t Value, |
| 49 | uint64_t Address) override; |
| 50 | }; |
| 51 | |
| 52 | } // namespace bolt |
| 53 | } // namespace llvm |
| 54 | |
| 55 | #endif |
| 56 | |