@@ -203,10 +203,11 @@ class UnwindGeneratorMacOS : public UnwindGenerator {
203203
204204 void ExtractPersonalityArray (ModuleInfo *module );
205205
206- size_t WriteCIE (ModuleInfo * module ,
206+ size_t WriteCIE (size_t addr ,
207207 const char *augmentation,
208- size_t personality_addr);
209- size_t WriteFDE (ModuleInfo *module ,
208+ size_t personality_addr,
209+ size_t *personality_remote_ptr);
210+ size_t WriteFDE (size_t addr,
210211 size_t cie_address,
211212 size_t min_address,
212213 size_t max_address);
@@ -245,10 +246,18 @@ class UnwindGeneratorMacOS : public UnwindGenerator {
245246 0x40 , 0x00 , 0x00 , 0xb4 , // cbz x0, skip_alignment
246247 0xff , 0x23 , 0x00 , 0xd1 , // sub sp, sp, #8
247248 // skip_alignment:
249+ // pac sign the personality
250+ 0xb4 , 0x00 , 0x00 , 0x58 , // ldr x20, #20;
251+ 0x93 , 0x02 , 0x40 , 0xf9 , // ldr x19, [x20]
252+ 0x93 , 0x02 , 0xc1 , 0xda , // pacia x19, x20
253+ 0x93 , 0x02 , 0x00 , 0xf9 , // str x19, [x20]
254+ 0x03 , 0x00 , 0x00 , 0x14 , // b #12; loop
255+ 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , // address of personaliy ptr goes here
256+ // load array params
248257 0x93 , 0x00 , 0x00 , 0x58 , // ldr x19, #16; x19 becomes the current array pointer
249258 0xb4 , 0x00 , 0x00 , 0x58 , // ldr x20, #20; x20 becomes the end array pointer
250259 0xd5 , 0x00 , 0x00 , 0x58 , // ldr x21, #24; x21 becomes __register_frame address
251- 0x09 , 0x00 , 0x00 , 0x14 , // b #36 ; loop
260+ 0x07 , 0x00 , 0x00 , 0x14 , // b #28 ; loop
252261 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , // array start addr goes here
253262 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , // array end addr goes here
254263 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , // __register_frame addr goes here
@@ -266,7 +275,8 @@ class UnwindGeneratorMacOS : public UnwindGenerator {
266275 0xe0 , 0x4f , 0x42 , 0xa9 , // ldp x0, x19, [sp, #32]
267276 0xff , 0xc3 , 0x00 , 0x91 , // add sp, sp, #48
268277 };
269- static const size_t register_assembly_arm64_data_offset = 48 ;
278+ static const size_t register_assembly_arm64_personality_offset = 52 ;
279+ static const size_t register_assembly_arm64_data_offset = 76 ;
270280#else
271281 static constexpr unsigned char register_assembly_x86[] = {
272282 // save registers
0 commit comments