UOP_TrapFrame,
UOP_Context,
UOP_ClearUnwoundToCall,
+ UOP_PACSignReturnAddress,
// 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:
+ Count += 1;
+ break;
}
}
return Count;
b = 0xEC;
streamer.emitInt8(b);
break;
+ case Win64EH::UOP_PACSignReturnAddress:
+ b = 0xFC;
+ streamer.emitInt8(b);
+ break;
}
}
bool parseDirectiveSEHMachineFrame(SMLoc L);
bool parseDirectiveSEHContext(SMLoc L);
bool parseDirectiveSEHClearUnwoundToCall(SMLoc L);
+ bool parseDirectiveSEHPACSignReturnAddress(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
return true;
} else
return false;
}
+/// parseDirectiveSEHPACSignReturnAddress
+/// ::= .seh_pac_sign_return_address
+bool AArch64AsmParser::parseDirectiveSEHPACSignReturnAddress(SMLoc L) {
+ getTargetStreamer().emitARM64WinCFIPACSignReturnAddress();
+ return false;
+}
+
bool
AArch64AsmParser::classifySymbolRef(const MCExpr *Expr,
AArch64MCExpr::VariantKind &ELFRefKind,
void emitARM64WinCFIClearUnwoundToCall() override {
OS << "\t.seh_clear_unwound_to_call\n";
}
+ void emitARM64WinCFIPACSignReturnAddress() override {
+ OS << "\t.seh_pac_sign_return_address\n";
+ }
public:
AArch64TargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS);
virtual void emitARM64WinCFIMachineFrame() {}
virtual void emitARM64WinCFIContext() {}
virtual void emitARM64WinCFIClearUnwoundToCall() {}
+ virtual void emitARM64WinCFIPACSignReturnAddress() {}
private:
std::unique_ptr<AssemblerConstantPools> ConstantPools;
void emitARM64WinCFIMachineFrame() override;
void emitARM64WinCFIContext() override;
void emitARM64WinCFIClearUnwoundToCall() override;
+ void emitARM64WinCFIPACSignReturnAddress() 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);
+}
+
MCWinCOFFStreamer *llvm::createAArch64WinCOFFStreamer(
MCContext &Context, std::unique_ptr<MCAsmBackend> MAB,
std::unique_ptr<MCObjectWriter> OW, std::unique_ptr<MCCodeEmitter> Emitter,
// CHECK-NEXT: }
// CHECK: Section {
// CHECK: Name: .xdata
-// CHECK: RawDataSize: 52
+// CHECK: RawDataSize: 56
// CHECK: RelocationCount: 1
// CHECK: Characteristics [
// CHECK-NEXT: ALIGN_4BYTES
// CHECK-NEXT: Relocations [
// CHECK-NEXT: Section (4) .xdata {
-// CHECK-NEXT: 0x28 IMAGE_REL_ARM64_ADDR32NB __C_specific_handler
+// CHECK-NEXT: 0x2C IMAGE_REL_ARM64_ADDR32NB __C_specific_handler
// CHECK-NEXT: }
// CHECK-NEXT: Section (5) .pdata {
// CHECK-NEXT: 0x0 IMAGE_REL_ARM64_ADDR32NB .text
// CHECK-NEXT: Function: func
// CHECK-NEXT: ExceptionRecord: .xdata
// CHECK-NEXT: ExceptionData {
-// CHECK-NEXT: FunctionLength: 100
+// CHECK-NEXT: FunctionLength: 104
// CHECK: Prologue [
+// CHECK-NEXT: 0xfc ; pacibsp
// CHECK-NEXT: 0xec ; clear unwound to call
// CHECK-NEXT: 0xea ; context
// CHECK-NEXT: 0xe9 ; machine frame
// CHECK-NEXT: 0x01 ; sub sp, #16
// CHECK-NEXT: 0xe4 ; end
// CHECK-NEXT: ]
-// CHECK-NEXT: Epilogue [
-// CHECK-NEXT: 0x01 ; add sp, #16
-// CHECK-NEXT: 0xe4 ; end
+// CHECK-NEXT: EpilogueScopes [
+// CHECK-NEXT: EpilogueScope {
+// CHECK-NEXT: StartOffset: 24
+// CHECK-NEXT: EpilogueStartIndex: 32
+// CHECK-NEXT: Opcodes [
+// CHECK-NEXT: 0x01 ; add sp, #16
+// CHECK-NEXT: 0xe4 ; end
+// CHECK-NEXT: ]
+// CHECK-NEXT: }
// CHECK-NEXT: ]
// CHECK-NEXT: ExceptionHandler [
// CHECK-NEXT: Routine: __C_specific_handler (0x0)
.seh_context
nop
.seh_clear_unwound_to_call
+ pacibsp
+ .seh_pac_sign_return_address
.seh_endprologue
nop
.seh_startepilogue