UOP_TrapFrame,
UOP_Context,
UOP_ClearUnwoundToCall,
- UOP_PACSignReturnAddress,
+ UOP_PACSignLR,
// The following set of unwind opcodes is for ARM. They are documented at
// https://docs.microsoft.com/en-us/cpp/build/arm-exception-handling
case Win64EH::UOP_ClearUnwoundToCall:
Count += 1;
break;
- case Win64EH::UOP_PACSignReturnAddress:
+ case Win64EH::UOP_PACSignLR:
Count += 1;
break;
}
b = 0xEC;
streamer.emitInt8(b);
break;
- case Win64EH::UOP_PACSignReturnAddress:
+ case Win64EH::UOP_PACSignLR:
b = 0xFC;
streamer.emitInt8(b);
break;
return false;
Location = Start2;
break;
- case Win64EH::UOP_PACSignReturnAddress:
+ case Win64EH::UOP_PACSignLR:
if (Location != Start2)
return false;
PAC = true;
bool parseDirectiveSEHMachineFrame(SMLoc L);
bool parseDirectiveSEHContext(SMLoc L);
bool parseDirectiveSEHClearUnwoundToCall(SMLoc L);
- bool parseDirectiveSEHPACSignReturnAddress(SMLoc L);
+ bool parseDirectiveSEHPACSignLR(SMLoc L);
bool validateInstruction(MCInst &Inst, SMLoc &IDLoc,
SmallVectorImpl<SMLoc> &Loc);
parseDirectiveSEHContext(Loc);
else if (IDVal == ".seh_clear_unwound_to_call")
parseDirectiveSEHClearUnwoundToCall(Loc);
- else if (IDVal == ".seh_pac_sign_return_address")
- parseDirectiveSEHPACSignReturnAddress(Loc);
+ else if (IDVal == ".seh_pac_sign_lr")
+ parseDirectiveSEHPACSignLR(Loc);
else
return true;
} else
return false;
}
-/// parseDirectiveSEHPACSignReturnAddress
-/// ::= .seh_pac_sign_return_address
-bool AArch64AsmParser::parseDirectiveSEHPACSignReturnAddress(SMLoc L) {
- getTargetStreamer().emitARM64WinCFIPACSignReturnAddress();
+/// parseDirectiveSEHPACSignLR
+/// ::= .seh_pac_sign_lr
+bool AArch64AsmParser::parseDirectiveSEHPACSignLR(SMLoc L) {
+ getTargetStreamer().emitARM64WinCFIPACSignLR();
return false;
}
void emitARM64WinCFIClearUnwoundToCall() override {
OS << "\t.seh_clear_unwound_to_call\n";
}
- void emitARM64WinCFIPACSignReturnAddress() override {
- OS << "\t.seh_pac_sign_return_address\n";
+ void emitARM64WinCFIPACSignLR() override {
+ OS << "\t.seh_pac_sign_lr\n";
}
public:
virtual void emitARM64WinCFIMachineFrame() {}
virtual void emitARM64WinCFIContext() {}
virtual void emitARM64WinCFIClearUnwoundToCall() {}
- virtual void emitARM64WinCFIPACSignReturnAddress() {}
+ virtual void emitARM64WinCFIPACSignLR() {}
private:
std::unique_ptr<AssemblerConstantPools> ConstantPools;
void emitARM64WinCFIMachineFrame() override;
void emitARM64WinCFIContext() override;
void emitARM64WinCFIClearUnwoundToCall() override;
- void emitARM64WinCFIPACSignReturnAddress() override;
+ void emitARM64WinCFIPACSignLR() override;
private:
void emitARM64WinUnwindCode(unsigned UnwindCode, int Reg, int Offset);
emitARM64WinUnwindCode(Win64EH::UOP_ClearUnwoundToCall, -1, 0);
}
-void AArch64TargetWinCOFFStreamer::emitARM64WinCFIPACSignReturnAddress() {
- emitARM64WinUnwindCode(Win64EH::UOP_PACSignReturnAddress, -1, 0);
+void AArch64TargetWinCOFFStreamer::emitARM64WinCFIPACSignLR() {
+ emitARM64WinUnwindCode(Win64EH::UOP_PACSignLR, -1, 0);
}
MCWinCOFFStreamer *llvm::createAArch64WinCOFFStreamer(
func16:
.seh_proc func16
pacibsp
- .seh_pac_sign_return_address
+ .seh_pac_sign_lr
stp x29, lr, [sp, #-32]!
.seh_save_fplr_x 32
mov x29, sp
ldp x29, lr, [sp], #32
.seh_save_fplr_x 32
autibsp
- .seh_pac_sign_return_address
+ .seh_pac_sign_lr
.seh_endepilogue
ret
.seh_endproc
func17:
.seh_proc func17
pacibsp
- .seh_pac_sign_return_address
+ .seh_pac_sign_lr
stp x19, x20, [sp, #-16]!
.seh_save_r19r20_x 16
stp x29, lr, [sp, #-32]!
ldp x19, x20, [sp], #16
.seh_save_r19r20_x 16
autibsp
- .seh_pac_sign_return_address
+ .seh_pac_sign_lr
.seh_endepilogue
ret
.seh_endproc
func18:
.seh_proc func18
pacibsp
- .seh_pac_sign_return_address
+ .seh_pac_sign_lr
stp x19, x20, [sp, #-16]!
.seh_save_r19r20_x 16
sub sp, sp, #4080
ldp x19, x20, [sp], #16
.seh_save_r19r20_x 16
autibsp
- .seh_pac_sign_return_address
+ .seh_pac_sign_lr
.seh_endepilogue
ret
.seh_endproc
// Can't be packed; a signed return address can only be expressed if
// we save both x29 and lr on the stack.
pacibsp
- .seh_pac_sign_return_address
+ .seh_pac_sign_lr
str lr, [sp, #-32]!
.seh_save_reg_x lr, 32
.seh_endprologue
ldr lr, [sp], #32
.seh_save_reg_x lr, 32
autibsp
- .seh_pac_sign_return_address
+ .seh_pac_sign_lr
.seh_endepilogue
ret
.seh_endproc
// Can't be packed; a signed return address can only be expressed if
// we save both x29 and lr on the stack.
pacibsp
- .seh_pac_sign_return_address
+ .seh_pac_sign_lr
stp x19, x20, [sp, #-32]!
.seh_save_r19r20_x 32
stp x21, lr, [sp, #16]
ldp x19, x20, [sp], #32
.seh_save_r19r20_x 32
autibsp
- .seh_pac_sign_return_address
+ .seh_pac_sign_lr
.seh_endepilogue
ret
.seh_endproc
nop
.seh_clear_unwound_to_call
pacibsp
- .seh_pac_sign_return_address
+ .seh_pac_sign_lr
.seh_endprologue
nop
.seh_startepilogue
{0xff, 0xe9, 1, &Decoder::opcode_machine_frame},
{0xff, 0xea, 1, &Decoder::opcode_context},
{0xff, 0xec, 1, &Decoder::opcode_clear_unwound_to_call},
- {0xff, 0xfc, 1, &Decoder::opcode_pac_sign_return_address},
+ {0xff, 0xfc, 1, &Decoder::opcode_pac_sign_lr},
};
static void printRange(raw_ostream &OS, ListSeparator &LS, unsigned First,
return false;
}
-bool Decoder::opcode_pac_sign_return_address(const uint8_t *OC,
- unsigned &Offset, unsigned Length,
- bool Prologue) {
+bool Decoder::opcode_pac_sign_lr(const uint8_t *OC, unsigned &Offset,
+ unsigned Length, bool Prologue) {
if (Prologue)
SW.startLine() << format("0x%02x ; pacibsp\n", OC[Offset]);
else
bool Prologue);
bool opcode_clear_unwound_to_call(const uint8_t *Opcodes, unsigned &Offset,
unsigned Length, bool Prologue);
- bool opcode_pac_sign_return_address(const uint8_t *Opcodes, unsigned &Offset,
- unsigned Length, bool Prologue);
+ bool opcode_pac_sign_lr(const uint8_t *Opcodes, unsigned &Offset,
+ unsigned Length, bool Prologue);
void decodeOpcodes(ArrayRef<uint8_t> Opcodes, unsigned Offset,
bool Prologue);