@@ -32,15 +32,36 @@ impl UnwindContext {
32
32
let mut frame_table = FrameTable :: default ( ) ;
33
33
34
34
let cie_id = if let Some ( mut cie) = module. isa ( ) . create_systemv_cie ( ) {
35
- if pic_eh_frame {
36
- cie. fde_address_encoding =
37
- gimli:: DwEhPe ( gimli:: DW_EH_PE_pcrel . 0 | gimli:: DW_EH_PE_sdata4 . 0 ) ;
38
- cie. lsda_encoding =
39
- Some ( gimli:: DwEhPe ( gimli:: DW_EH_PE_pcrel . 0 | gimli:: DW_EH_PE_sdata4 . 0 ) ) ;
35
+ let ptr_encoding = if pic_eh_frame {
36
+ gimli:: DwEhPe ( gimli:: DW_EH_PE_pcrel . 0 | gimli:: DW_EH_PE_sdata4 . 0 )
40
37
} else {
41
- cie. fde_address_encoding = gimli:: DW_EH_PE_absptr ;
42
- cie. lsda_encoding = Some ( gimli:: DW_EH_PE_absptr ) ;
43
- }
38
+ gimli:: DW_EH_PE_absptr
39
+ } ;
40
+ let code_ptr_encoding = if pic_eh_frame {
41
+ if module. isa ( ) . triple ( ) . architecture == target_lexicon:: Architecture :: X86_64 {
42
+ gimli:: DwEhPe (
43
+ gimli:: DW_EH_PE_indirect . 0
44
+ | gimli:: DW_EH_PE_pcrel . 0
45
+ | gimli:: DW_EH_PE_sdata4 . 0 ,
46
+ )
47
+ } else if let target_lexicon:: Architecture :: Aarch64 ( _) =
48
+ module. isa ( ) . triple ( ) . architecture
49
+ {
50
+ gimli:: DwEhPe (
51
+ gimli:: DW_EH_PE_indirect . 0
52
+ | gimli:: DW_EH_PE_pcrel . 0
53
+ | gimli:: DW_EH_PE_sdata8 . 0 ,
54
+ )
55
+ } else {
56
+ todo ! ( )
57
+ }
58
+ } else {
59
+ gimli:: DwEhPe ( gimli:: DW_EH_PE_indirect . 0 | gimli:: DW_EH_PE_absptr . 0 )
60
+ } ;
61
+
62
+ cie. fde_address_encoding = ptr_encoding;
63
+ cie. lsda_encoding = Some ( ptr_encoding) ;
64
+
44
65
// FIXME use eh_personality lang item instead
45
66
let personality = module
46
67
. declare_function (
@@ -75,26 +96,7 @@ impl UnwindContext {
75
96
76
97
module. define_data ( personality_ref, & personality_ref_data) . unwrap ( ) ;
77
98
78
- cie. personality = Some ( (
79
- if module. isa ( ) . triple ( ) . architecture == target_lexicon:: Architecture :: X86_64 {
80
- gimli:: DwEhPe (
81
- gimli:: DW_EH_PE_indirect . 0
82
- | gimli:: DW_EH_PE_pcrel . 0
83
- | gimli:: DW_EH_PE_sdata4 . 0 ,
84
- )
85
- } else if let target_lexicon:: Architecture :: Aarch64 ( _) =
86
- module. isa ( ) . triple ( ) . architecture
87
- {
88
- gimli:: DwEhPe (
89
- gimli:: DW_EH_PE_indirect . 0
90
- | gimli:: DW_EH_PE_pcrel . 0
91
- | gimli:: DW_EH_PE_sdata8 . 0 ,
92
- )
93
- } else {
94
- todo ! ( )
95
- } ,
96
- address_for_data ( personality_ref) ,
97
- ) ) ;
99
+ cie. personality = Some ( ( code_ptr_encoding, address_for_data ( personality_ref) ) ) ;
98
100
Some ( frame_table. add_cie ( cie) )
99
101
} else {
100
102
None
0 commit comments