1 //===-- ARMUnwindOpAsm.h - ARM Unwind Opcodes Assembler ---------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file declares the unwind opcode assmebler for ARM exception handling
13 //===----------------------------------------------------------------------===//
15 #ifndef ARM_UNWIND_OP_ASM_H
16 #define ARM_UNWIND_OP_ASM_H
18 #include "llvm/ADT/SmallVector.h"
19 #include "llvm/Support/ARMEHABI.h"
20 #include "llvm/Support/DataTypes.h"
26 class UnwindOpcodeAssembler {
28 llvm::SmallVector<uint8_t, 32> Ops;
29 llvm::SmallVector<unsigned, 8> OpBegins;
33 UnwindOpcodeAssembler()
35 OpBegins.push_back(0);
38 /// Reset the unwind opcode assembler.
42 OpBegins.push_back(0);
46 /// Set the personality
47 void setPersonality(const MCSymbol *Per) {
51 /// Emit unwind opcodes for .save directives
52 void EmitRegSave(uint32_t RegSave);
54 /// Emit unwind opcodes for .vsave directives
55 void EmitVFPRegSave(uint32_t VFPRegSave);
57 /// Emit unwind opcodes to copy address from source register to $sp.
58 void EmitSetSP(uint16_t Reg);
60 /// Emit unwind opcodes to add $sp with an offset.
61 void EmitSPOffset(int64_t Offset);
63 /// Emit unwind raw opcodes
64 void EmitRaw(const SmallVectorImpl<uint8_t> &Opcodes) {
65 Ops.insert(Ops.end(), Opcodes.begin(), Opcodes.end());
66 OpBegins.push_back(OpBegins.back() + Opcodes.size());
69 /// Finalize the unwind opcode sequence for EmitBytes()
70 void Finalize(unsigned &PersonalityIndex,
71 SmallVectorImpl<uint8_t> &Result);
74 void EmitInt8(unsigned Opcode) {
75 Ops.push_back(Opcode & 0xff);
76 OpBegins.push_back(OpBegins.back() + 1);
79 void EmitInt16(unsigned Opcode) {
80 Ops.push_back((Opcode >> 8) & 0xff);
81 Ops.push_back(Opcode & 0xff);
82 OpBegins.push_back(OpBegins.back() + 2);
85 void EmitBytes(const uint8_t *Opcode, size_t Size) {
86 Ops.insert(Ops.end(), Opcode, Opcode + Size);
87 OpBegins.push_back(OpBegins.back() + Size);
93 #endif // ARM_UNWIND_OP_ASM_H