@@ -29,15 +29,36 @@ impl UnwindContext {
2929 let mut frame_table = FrameTable :: default ( ) ;
3030
3131 let cie_id = if let Some ( mut cie) = module. isa ( ) . create_systemv_cie ( ) {
32- if pic_eh_frame {
33- cie. fde_address_encoding =
34- gimli:: DwEhPe ( gimli:: DW_EH_PE_pcrel . 0 | gimli:: DW_EH_PE_sdata4 . 0 ) ;
35- cie. lsda_encoding =
36- Some ( gimli:: DwEhPe ( gimli:: DW_EH_PE_pcrel . 0 | gimli:: DW_EH_PE_sdata4 . 0 ) ) ;
32+ let ptr_encoding = if pic_eh_frame {
33+ gimli:: DwEhPe ( gimli:: DW_EH_PE_pcrel . 0 | gimli:: DW_EH_PE_sdata4 . 0 )
3734 } else {
38- cie. fde_address_encoding = gimli:: DW_EH_PE_absptr ;
39- cie. lsda_encoding = Some ( gimli:: DW_EH_PE_absptr ) ;
40- }
35+ gimli:: DW_EH_PE_absptr
36+ } ;
37+ let code_ptr_encoding = if pic_eh_frame {
38+ if module. isa ( ) . triple ( ) . architecture == target_lexicon:: Architecture :: X86_64 {
39+ gimli:: DwEhPe (
40+ gimli:: DW_EH_PE_indirect . 0
41+ | gimli:: DW_EH_PE_pcrel . 0
42+ | gimli:: DW_EH_PE_sdata4 . 0 ,
43+ )
44+ } else if let target_lexicon:: Architecture :: Aarch64 ( _) =
45+ module. isa ( ) . triple ( ) . architecture
46+ {
47+ gimli:: DwEhPe (
48+ gimli:: DW_EH_PE_indirect . 0
49+ | gimli:: DW_EH_PE_pcrel . 0
50+ | gimli:: DW_EH_PE_sdata8 . 0 ,
51+ )
52+ } else {
53+ todo ! ( )
54+ }
55+ } else {
56+ gimli:: DwEhPe ( gimli:: DW_EH_PE_indirect . 0 | gimli:: DW_EH_PE_absptr . 0 )
57+ } ;
58+
59+ cie. fde_address_encoding = ptr_encoding;
60+ cie. lsda_encoding = Some ( ptr_encoding) ;
61+
4162 // FIXME use eh_personality lang item instead
4263 let personality = module
4364 . declare_function (
@@ -72,26 +93,7 @@ impl UnwindContext {
7293
7394 module. define_data ( personality_ref, & personality_ref_data) . unwrap ( ) ;
7495
75- cie. personality = Some ( (
76- if module. isa ( ) . triple ( ) . architecture == target_lexicon:: Architecture :: X86_64 {
77- gimli:: DwEhPe (
78- gimli:: DW_EH_PE_indirect . 0
79- | gimli:: DW_EH_PE_pcrel . 0
80- | gimli:: DW_EH_PE_sdata4 . 0 ,
81- )
82- } else if let target_lexicon:: Architecture :: Aarch64 ( _) =
83- module. isa ( ) . triple ( ) . architecture
84- {
85- gimli:: DwEhPe (
86- gimli:: DW_EH_PE_indirect . 0
87- | gimli:: DW_EH_PE_pcrel . 0
88- | gimli:: DW_EH_PE_sdata8 . 0 ,
89- )
90- } else {
91- todo ! ( )
92- } ,
93- address_for_data ( personality_ref) ,
94- ) ) ;
96+ cie. personality = Some ( ( code_ptr_encoding, address_for_data ( personality_ref) ) ) ;
9597 Some ( frame_table. add_cie ( cie) )
9698 } else {
9799 None
@@ -235,10 +237,10 @@ impl UnwindContext {
235237 }
236238
237239 #[ cfg( all( feature = "jit" , windows) ) ]
238- pub ( crate ) unsafe fn register_jit ( self , _jit_module : & cranelift_jit:: JITModule ) { }
240+ pub ( crate ) unsafe fn register_jit ( & mut self , _jit_module : & cranelift_jit:: JITModule ) { }
239241
240242 #[ cfg( all( feature = "jit" , not( windows) ) ) ]
241- pub ( crate ) unsafe fn register_jit ( self , jit_module : & cranelift_jit:: JITModule ) {
243+ pub ( crate ) unsafe fn register_jit ( & mut self , jit_module : & cranelift_jit:: JITModule ) {
242244 use std:: mem:: ManuallyDrop ;
243245
244246 let mut eh_frame = EhFrame :: from ( super :: emit:: WriterRelocate :: new ( self . endian ) ) ;
0 commit comments