LLVM 18.0.0git
ARMUnwindOpAsm.h
Go to the documentation of this file.
1//===-- ARMUnwindOpAsm.h - ARM Unwind Opcodes Assembler ---------*- 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// This file declares the unwind opcode assembler for ARM exception handling
10// table.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_LIB_TARGET_ARM_MCTARGETDESC_ARMUNWINDOPASM_H
15#define LLVM_LIB_TARGET_ARM_MCTARGETDESC_ARMUNWINDOPASM_H
16
18#include <cstddef>
19#include <cstdint>
20
21namespace llvm {
22
23class MCSymbol;
24
26private:
29 bool HasPersonality = false;
30
31public:
33 OpBegins.push_back(0);
34 }
35
36 /// Reset the unwind opcode assembler.
37 void Reset() {
38 Ops.clear();
39 OpBegins.clear();
40 OpBegins.push_back(0);
41 HasPersonality = false;
42 }
43
44 /// Set the personality
45 void setPersonality(const MCSymbol *Per) {
46 HasPersonality = true;
47 }
48
49 /// Emit unwind opcodes for .save directives
50 void EmitRegSave(uint32_t RegSave);
51
52 /// Emit unwind opcodes for .vsave directives
53 void EmitVFPRegSave(uint32_t VFPRegSave);
54
55 /// Emit unwind opcodes to copy address from source register to $sp.
57
58 /// Emit unwind opcodes to add $sp with an offset.
59 void EmitSPOffset(int64_t Offset);
60
61 /// Emit unwind raw opcodes
62 void EmitRaw(const SmallVectorImpl<uint8_t> &Opcodes) {
63 Ops.insert(Ops.end(), Opcodes.begin(), Opcodes.end());
64 OpBegins.push_back(OpBegins.back() + Opcodes.size());
65 }
66
67 /// Finalize the unwind opcode sequence for emitBytes()
68 void Finalize(unsigned &PersonalityIndex,
70
71private:
72 void EmitInt8(unsigned Opcode) {
73 Ops.push_back(Opcode & 0xff);
74 OpBegins.push_back(OpBegins.back() + 1);
75 }
76
77 void EmitInt16(unsigned Opcode) {
78 Ops.push_back((Opcode >> 8) & 0xff);
79 Ops.push_back(Opcode & 0xff);
80 OpBegins.push_back(OpBegins.back() + 2);
81 }
82
83 void emitBytes(const uint8_t *Opcode, size_t Size) {
84 Ops.insert(Ops.end(), Opcode, Opcode + Size);
85 OpBegins.push_back(OpBegins.back() + Size);
86 }
87};
88
89} // end namespace llvm
90
91#endif // LLVM_LIB_TARGET_ARM_MCTARGETDESC_ARMUNWINDOPASM_H
uint64_t Size
unsigned Reg
This file defines the SmallVector class.
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition: MCSymbol.h:41
size_t size() const
Definition: SmallVector.h:91
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: SmallVector.h:577
iterator insert(iterator I, T &&Elt)
Definition: SmallVector.h:809
void push_back(const T &Elt)
Definition: SmallVector.h:416
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1200
void EmitSetSP(uint16_t Reg)
Emit unwind opcodes to copy address from source register to $sp.
void EmitVFPRegSave(uint32_t VFPRegSave)
Emit unwind opcodes for .vsave directives.
void EmitRegSave(uint32_t RegSave)
Emit unwind opcodes for .save directives.
void setPersonality(const MCSymbol *Per)
Set the personality.
void EmitSPOffset(int64_t Offset)
Emit unwind opcodes to add $sp with an offset.
void Reset()
Reset the unwind opcode assembler.
void EmitRaw(const SmallVectorImpl< uint8_t > &Opcodes)
Emit unwind raw opcodes.
void Finalize(unsigned &PersonalityIndex, SmallVectorImpl< uint8_t > &Result)
Finalize the unwind opcode sequence for emitBytes()
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
@ Offset
Definition: DWP.cpp:440