Coverage Report

Created: 2024-01-17 10:31

/src/llvm-project/llvm/lib/Target/AVR/MCTargetDesc/AVRMCCodeEmitter.h
Line
Count
Source (jump to first uncovered line)
1
//===-- AVRMCCodeEmitter.h - Convert AVR Code to Machine Code -------------===//
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
// This file defines the AVRMCCodeEmitter class.
10
//
11
//===----------------------------------------------------------------------===//
12
//
13
14
#ifndef LLVM_AVR_CODE_EMITTER_H
15
#define LLVM_AVR_CODE_EMITTER_H
16
17
#include "AVRFixupKinds.h"
18
19
#include "llvm/MC/MCCodeEmitter.h"
20
#include "llvm/Support/DataTypes.h"
21
22
#define GET_INSTRINFO_OPERAND_TYPES_ENUM
23
#include "AVRGenInstrInfo.inc"
24
25
namespace llvm {
26
27
class MCContext;
28
class MCExpr;
29
class MCFixup;
30
class MCInst;
31
class MCInstrInfo;
32
class MCOperand;
33
class MCSubtargetInfo;
34
class raw_ostream;
35
36
/// Writes AVR machine code to a stream.
37
class AVRMCCodeEmitter : public MCCodeEmitter {
38
public:
39
  AVRMCCodeEmitter(const MCInstrInfo &MCII, MCContext &Ctx)
40
0
      : MCII(MCII), Ctx(Ctx) {}
41
42
private:
43
  /// Finishes up encoding an LD/ST instruction.
44
  /// The purpose of this function is to set an bit in the instruction
45
  /// which follows no logical pattern. See the implementation for details.
46
  unsigned loadStorePostEncoder(const MCInst &MI, unsigned EncodedValue,
47
                                const MCSubtargetInfo &STI) const;
48
49
  /// Gets the encoding for a conditional branch target.
50
  template <AVR::Fixups Fixup>
51
  unsigned encodeRelCondBrTarget(const MCInst &MI, unsigned OpNo,
52
                                 SmallVectorImpl<MCFixup> &Fixups,
53
                                 const MCSubtargetInfo &STI) const;
54
55
  /// Encodes the `PTRREGS` operand to a load or store instruction.
56
  unsigned encodeLDSTPtrReg(const MCInst &MI, unsigned OpNo,
57
                            SmallVectorImpl<MCFixup> &Fixups,
58
                            const MCSubtargetInfo &STI) const;
59
60
  /// Encodes a `register+immediate` operand for `LDD`/`STD`.
61
  unsigned encodeMemri(const MCInst &MI, unsigned OpNo,
62
                       SmallVectorImpl<MCFixup> &Fixups,
63
                       const MCSubtargetInfo &STI) const;
64
65
  /// Takes the complement of a number (~0 - val).
66
  unsigned encodeComplement(const MCInst &MI, unsigned OpNo,
67
                            SmallVectorImpl<MCFixup> &Fixups,
68
                            const MCSubtargetInfo &STI) const;
69
70
  /// Encodes an immediate value with a given fixup.
71
  /// \tparam Offset The offset into the instruction for the fixup.
72
  template <AVR::Fixups Fixup, unsigned Offset>
73
  unsigned encodeImm(const MCInst &MI, unsigned OpNo,
74
                     SmallVectorImpl<MCFixup> &Fixups,
75
                     const MCSubtargetInfo &STI) const;
76
77
  /// Gets the encoding of the target for the `CALL k` instruction.
78
  unsigned encodeCallTarget(const MCInst &MI, unsigned OpNo,
79
                            SmallVectorImpl<MCFixup> &Fixups,
80
                            const MCSubtargetInfo &STI) const;
81
82
  /// TableGen'ed function to get the binary encoding for an instruction.
83
  uint64_t getBinaryCodeForInstr(const MCInst &MI,
84
                                 SmallVectorImpl<MCFixup> &Fixups,
85
                                 const MCSubtargetInfo &STI) const;
86
87
  unsigned getExprOpValue(const MCExpr *Expr, SmallVectorImpl<MCFixup> &Fixups,
88
                          const MCSubtargetInfo &STI) const;
89
90
  /// Returns the binary encoding of operand.
91
  ///
92
  /// If the machine operand requires relocation, the relocation is recorded
93
  /// and zero is returned.
94
  unsigned getMachineOpValue(const MCInst &MI, const MCOperand &MO,
95
                             SmallVectorImpl<MCFixup> &Fixups,
96
                             const MCSubtargetInfo &STI) const;
97
98
  void encodeInstruction(const MCInst &MI, SmallVectorImpl<char> &CB,
99
                         SmallVectorImpl<MCFixup> &Fixups,
100
                         const MCSubtargetInfo &STI) const override;
101
102
  AVRMCCodeEmitter(const AVRMCCodeEmitter &) = delete;
103
  void operator=(const AVRMCCodeEmitter &) = delete;
104
105
  const MCInstrInfo &MCII;
106
  MCContext &Ctx;
107
};
108
109
} // namespace llvm
110
111
#endif // LLVM_AVR_CODE_EMITTER_H