@@ -29,15 +29,36 @@ impl UnwindContext {
29
29
let mut frame_table = FrameTable :: default ( ) ;
30
30
31
31
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 )
37
34
} 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
+
41
62
// FIXME use eh_personality lang item instead
42
63
let personality = module
43
64
. declare_function (
@@ -72,26 +93,7 @@ impl UnwindContext {
72
93
73
94
module. define_data ( personality_ref, & personality_ref_data) . unwrap ( ) ;
74
95
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) ) ) ;
95
97
Some ( frame_table. add_cie ( cie) )
96
98
} else {
97
99
None
0 commit comments