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/ADT/StringRef.h"
20 #include "llvm/Support/ARMEHABI.h"
21 #include "llvm/Support/DataTypes.h"
27 class UnwindOpcodeAssembler {
29 llvm::SmallVector<uint8_t, 32> Ops;
30 llvm::SmallVector<unsigned, 8> OpBegins;
34 UnwindOpcodeAssembler()
36 OpBegins.push_back(0);
39 /// Reset the unwind opcode assembler.
43 OpBegins.push_back(0);
47 /// Set the personality
48 void setPersonality(const MCSymbol *Per) {
52 /// Emit unwind opcodes for .save directives
53 void EmitRegSave(uint32_t RegSave);
55 /// Emit unwind opcodes for .vsave directives
56 void EmitVFPRegSave(uint32_t VFPRegSave);
58 /// Emit unwind opcodes to copy address from source register to $sp.
59 void EmitSetSP(uint16_t Reg);
61 /// Emit unwind opcodes to add $sp with an offset.
62 void EmitSPOffset(int64_t Offset);
64 /// Emit unwind raw opcodes
65 void EmitRaw(const SmallVectorImpl<uint8_t> &Opcodes) {
66 Ops.insert(Ops.end(), Opcodes.begin(), Opcodes.end());
67 OpBegins.push_back(OpBegins.back() + Opcodes.size());
70 /// Finalize the unwind opcode sequence for EmitBytes()
71 void Finalize(unsigned &PersonalityIndex,
72 SmallVectorImpl<uint8_t> &Result);
75 void EmitInt8(unsigned Opcode) {
76 Ops.push_back(Opcode & 0xff);
77 OpBegins.push_back(OpBegins.back() + 1);
80 void EmitInt16(unsigned Opcode) {
81 Ops.push_back((Opcode >> 8) & 0xff);
82 Ops.push_back(Opcode & 0xff);
83 OpBegins.push_back(OpBegins.back() + 2);
86 void EmitBytes(const uint8_t *Opcode, size_t Size) {
87 Ops.insert(Ops.end(), Opcode, Opcode + Size);
88 OpBegins.push_back(OpBegins.back() + Size);
94 #endif // ARM_UNWIND_OP_ASM_H