1 //===-- ARMUnwindOpAsm.h - ARM Unwind Opcodes Assembler ---------*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 // This file declares the unwind opcode assmebler for ARM exception handling
12 //===----------------------------------------------------------------------===//
14 #ifndef LLVM_LIB_TARGET_ARM_MCTARGETDESC_ARMUNWINDOPASM_H
15 #define LLVM_LIB_TARGET_ARM_MCTARGETDESC_ARMUNWINDOPASM_H
17 #include "llvm/ADT/SmallVector.h"
25 class UnwindOpcodeAssembler
{
27 SmallVector
<uint8_t, 32> Ops
;
28 SmallVector
<unsigned, 8> OpBegins
;
29 bool HasPersonality
= false;
32 UnwindOpcodeAssembler() {
33 OpBegins
.push_back(0);
36 /// Reset the unwind opcode assembler.
40 OpBegins
.push_back(0);
41 HasPersonality
= false;
44 /// Set the personality
45 void setPersonality(const MCSymbol
*Per
) {
46 HasPersonality
= true;
49 /// Emit unwind opcodes for .save directives
50 void EmitRegSave(uint32_t RegSave
);
52 /// Emit unwind opcodes for .vsave directives
53 void EmitVFPRegSave(uint32_t VFPRegSave
);
55 /// Emit unwind opcodes to copy address from source register to $sp.
56 void EmitSetSP(uint16_t Reg
);
58 /// Emit unwind opcodes to add $sp with an offset.
59 void EmitSPOffset(int64_t Offset
);
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());
67 /// Finalize the unwind opcode sequence for EmitBytes()
68 void Finalize(unsigned &PersonalityIndex
,
69 SmallVectorImpl
<uint8_t> &Result
);
72 void EmitInt8(unsigned Opcode
) {
73 Ops
.push_back(Opcode
& 0xff);
74 OpBegins
.push_back(OpBegins
.back() + 1);
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);
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
);
89 } // end namespace llvm
91 #endif // LLVM_LIB_TARGET_ARM_MCTARGETDESC_ARMUNWINDOPASM_H