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 "ARMUnwindOp.h"
20 #include "llvm/ADT/SmallVector.h"
21 #include "llvm/ADT/StringRef.h"
22 #include "llvm/Support/DataTypes.h"
28 class UnwindOpcodeAssembler {
30 llvm::SmallVector<uint8_t, 32> Ops;
31 llvm::SmallVector<unsigned, 8> OpBegins;
35 UnwindOpcodeAssembler()
37 OpBegins.push_back(0);
40 /// Reset the unwind opcode assembler.
44 OpBegins.push_back(0);
48 /// Set the personality index
49 void setPersonality(const MCSymbol *Per) {
53 /// Emit unwind opcodes for .save directives
54 void EmitRegSave(uint32_t RegSave);
56 /// Emit unwind opcodes for .vsave directives
57 void EmitVFPRegSave(uint32_t VFPRegSave);
59 /// Emit unwind opcodes to copy address from source register to $sp.
60 void EmitSetSP(uint16_t Reg);
62 /// Emit unwind opcodes to add $sp with an offset.
63 void EmitSPOffset(int64_t Offset);
65 /// Finalize the unwind opcode sequence for EmitBytes()
66 void Finalize(unsigned &PersonalityIndex,
67 SmallVectorImpl<uint8_t> &Result);
70 void EmitInt8(unsigned Opcode) {
71 Ops.push_back(Opcode & 0xff);
72 OpBegins.push_back(OpBegins.back() + 1);
75 void EmitInt16(unsigned Opcode) {
76 Ops.push_back((Opcode >> 8) & 0xff);
77 Ops.push_back(Opcode & 0xff);
78 OpBegins.push_back(OpBegins.back() + 2);
81 void EmitBytes(const uint8_t *Opcode, size_t Size) {
82 Ops.insert(Ops.end(), Opcode, Opcode + Size);
83 OpBegins.push_back(OpBegins.back() + Size);
89 #endif // ARM_UNWIND_OP_ASM_H