diff options
author | Richard Henderson <rth@redhat.com> | 2001-05-16 15:42:36 -0700 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2001-05-16 15:42:36 -0700 |
commit | e1f9550a643dc51e8058afeba44c818350a9012b (patch) | |
tree | 0115a87b72de59adf0b97d879e1d5d59187631ab /gcc/dwarf2out.c | |
parent | f2cf5c14d84944afe85e2736d5582c5721a99d9a (diff) | |
download | gcc-e1f9550a643dc51e8058afeba44c818350a9012b.zip gcc-e1f9550a643dc51e8058afeba44c818350a9012b.tar.gz gcc-e1f9550a643dc51e8058afeba44c818350a9012b.tar.bz2 |
except.c (eh_data_format_name): Move to ...
* except.c (eh_data_format_name): Move to ...
* dwarf2asm.c: ... here. Use designated initializers if available.
(dw2_asm_output_encoded_addr_rtx): Accept varargs commentary.
* dwarf2asm.h: Update declarations.
* dwarf2out.c (output_cfi) [DW_CFA_set_loc]: If for_eh, mind
ASM_PREFERRED_EH_DATA_FORMAT.
(output_call_frame_info): Likewise. Use 'L' augmentation for
the LSDA encoding.
* unwind-dw2-fde.h (struct fde_vector): New.
(struct old_object): Rename from struct object.
(struct object): New.
(__register_frame_info_bases): Declare.
(__register_frame_info_table_bases): Declare.
(struct dwarf_fde): Remove explicit pc_begin/pc_range members.
* unwind-dw2-fde.c (objects): Remove.
(unseen_objects, seen_objects): New.
(__register_frame_info_bases): New.
(__register_frame_info): Use it.
(__register_frame_info_table_bases): New.
(__register_frame_info_table): Use it.
(__deregister_frame_info): Rewrite for changed object struct.
(base_from_object, get_cie_encoding, get_fde_encoding): New.
(fde_unencoded_compare): Rename from fde_compare; uninline.
(fde_single_encoding_compare, fde_mixed_encoding_compare): New.
(start_fde_sort): Adjust for new definition of fde_vector.
(fde_insert): Likewise.
(end_fde_sort): Likewise. Select comparison function based
on properties of the object.
(fde_split): Take object and fde_compare_t arguments.
(frame_heapsort, fde_merge): Likewise.
(classify_object_over_fdes): Rename from count_fdes. Handle
encoded pointers. Collect encoding, mixed_encoding, and pc_begin
for the object.
(add_fdes): Handle encoded pointers.
(init_object): Rename from frame_init. Update for new struct object.
(linear_search_fdes): Rename from search_fdes. Handle encoded
pointers.
(binary_search_unencoded_fdes): Broken out from _Unwind_Find_FDE.
(binary_search_single_encoding_fdes): New.
(binary_search_mixed_encoding_fdes): New.
(search_object): New.
(_Unwind_Find_FDE): Update for new struct object. Fill in
the dwarf_eh_bases.
* unwind-dw2.c: Include unwind-pe.h. Constify all pointers
iterating over EH data.
(_Unwind_FrameState): Remove saw_lsda, addr_encoding. Add
fde_encoding, lsda_encoding.
(read_uleb128, read_sleb128): Remove.
(read_encoded_pointer): Remove. All callers use read_encoded_value.
(extract_cie_info): Set lsda_encoding from 'L' augmentation.
(uw_frame_state_for): Don't set bases.func. Handle encoded fde
pointers.
* unwind-pe.h: Add "struct" to _Unwind_Context references.
From-SVN: r42176
Diffstat (limited to 'gcc/dwarf2out.c')
-rw-r--r-- | gcc/dwarf2out.c | 126 |
1 files changed, 93 insertions, 33 deletions
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index db83932..570c87a 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -1649,8 +1649,14 @@ output_cfi (cfi, fde, for_eh) switch (cfi->dw_cfi_opc) { case DW_CFA_set_loc: - dw2_asm_output_addr ((for_eh ? PTR_SIZE : DWARF2_ADDR_SIZE), - cfi->dw_cfi_oprnd1.dw_cfi_addr, NULL); + if (for_eh) + dw2_asm_output_encoded_addr_rtx ( + ASM_PREFERRED_EH_DATA_FORMAT (/*code=*/1, /*global=*/0), + gen_rtx_SYMBOL_REF (Pmode, cfi->dw_cfi_oprnd1.dw_cfi_addr), + NULL); + else + dw2_asm_output_addr (DWARF2_ADDR_SIZE, + cfi->dw_cfi_oprnd1.dw_cfi_addr, NULL); break; case DW_CFA_advance_loc1: dw2_asm_output_delta (1, cfi->dw_cfi_oprnd1.dw_cfi_addr, @@ -1717,6 +1723,10 @@ output_call_frame_info (for_eh) char l1[20], l2[20]; int any_lsda_needed = 0; char augmentation[6]; + int augmentation_size; + int fde_encoding = DW_EH_PE_absptr; + int per_encoding = DW_EH_PE_absptr; + int lsda_encoding = DW_EH_PE_absptr; /* If we don't have any functions we'll want to unwind out of, don't emit any EH unwind information. */ @@ -1770,20 +1780,46 @@ output_call_frame_info (for_eh) dw2_asm_output_data (1, DW_CIE_VERSION, "CIE Version"); augmentation[0] = 0; + augmentation_size = 0; if (for_eh) { + char *p; + /* Augmentation: z Indicates that a uleb128 is present to size the augmentation section. - R Indicates a pointer encoding for CIE and FDE pointers. - P Indicates the presence of a language personality - routine in the CIE augmentation and an LSDA in the - FDE augmentation. */ - - /* ??? Handle pointer encodings. */ - + L Indicates the encoding (and thus presence) of + an LSDA pointer in the FDE augmentation. + R Indicates a non-default pointer encoding for + FDE code pointers. + P Indicates the presence of an encoding + language + personality routine in the CIE augmentation. */ + + fde_encoding = ASM_PREFERRED_EH_DATA_FORMAT (/*code=*/1, /*global=*/0); + per_encoding = ASM_PREFERRED_EH_DATA_FORMAT (/*code=*/2, /*global=*/1); + lsda_encoding = ASM_PREFERRED_EH_DATA_FORMAT (/*code=*/0, /*global=*/0); + + p = augmentation + 1; + if (eh_personality_libfunc) + { + *p++ = 'P'; + augmentation_size += 1 + size_of_encoded_value (per_encoding); + } if (any_lsda_needed) - strcpy (augmentation, "zP"); + { + *p++ = 'L'; + augmentation_size += 1; + } + if (fde_encoding != DW_EH_PE_absptr) + { + *p++ = 'R'; + augmentation_size += 1; + } + if (p > augmentation + 1) + { + augmentation[0] = 'z'; + *p = '\0'; + } } dw2_asm_output_nstring (augmentation, -1, "CIE Augmentation"); @@ -1796,12 +1832,20 @@ output_call_frame_info (for_eh) if (augmentation[0]) { - dw2_asm_output_data_uleb128 (PTR_SIZE, "Augmentation size"); + dw2_asm_output_data_uleb128 (augmentation_size, "Augmentation size"); if (eh_personality_libfunc) - dw2_asm_output_addr_rtx (PTR_SIZE, eh_personality_libfunc, - "Personality"); - else - dw2_asm_output_data (PTR_SIZE, 0, "Personality (none)"); + { + dw2_asm_output_data (1, per_encoding, "Personality (%s)", + eh_data_format_name (per_encoding)); + dw2_asm_output_encoded_addr_rtx (per_encoding, + eh_personality_libfunc, NULL); + } + if (any_lsda_needed) + dw2_asm_output_data (1, lsda_encoding, "LSDA Encoding (%s)", + eh_data_format_name (lsda_encoding)); + if (fde_encoding != DW_EH_PE_absptr) + dw2_asm_output_data (1, fde_encoding, "FDE Encoding (%s)", + eh_data_format_name (fde_encoding)); } for (cfi = cie_cfi_head; cfi != NULL; cfi = cfi->dw_cfi_next) @@ -1843,29 +1887,45 @@ output_call_frame_info (for_eh) stripattributes (FRAME_SECTION), "FDE CIE offset"); - dw2_asm_output_addr ((for_eh ? PTR_SIZE : DWARF2_ADDR_SIZE), - fde->dw_fde_begin, - "FDE initial location"); - - dw2_asm_output_delta ((for_eh ? PTR_SIZE : DWARF2_ADDR_SIZE), - fde->dw_fde_end, - fde->dw_fde_begin, - "FDE address range"); + if (for_eh) + { + dw2_asm_output_encoded_addr_rtx (fde_encoding, + gen_rtx_SYMBOL_REF (Pmode, fde->dw_fde_begin), + "FDE initial location"); + dw2_asm_output_delta (size_of_encoded_value (fde_encoding), + fde->dw_fde_end, fde->dw_fde_begin, + "FDE address range"); + } + else + { + dw2_asm_output_addr (DWARF2_ADDR_SIZE, fde->dw_fde_begin, + "FDE initial location"); + dw2_asm_output_delta (DWARF2_ADDR_SIZE, + fde->dw_fde_end, fde->dw_fde_begin, + "FDE address range"); + } if (augmentation[0]) { - dw2_asm_output_data_uleb128 ((for_eh ? PTR_SIZE : DWARF2_ADDR_SIZE), - "Augmentation size"); - - if (fde->uses_eh_lsda) + if (any_lsda_needed) { - ASM_GENERATE_INTERNAL_LABEL (l1, "LLSDA", fde->funcdef_number); - dw2_asm_output_offset ((for_eh ? PTR_SIZE : DWARF2_ADDR_SIZE), - l1, "Language Specific Data Area"); + dw2_asm_output_data_uleb128 ( + size_of_encoded_value (lsda_encoding), "Augmentation size"); + + if (fde->uses_eh_lsda) + { + ASM_GENERATE_INTERNAL_LABEL (l1, "LLSDA", + fde->funcdef_number); + dw2_asm_output_encoded_addr_rtx ( + lsda_encoding, gen_rtx_SYMBOL_REF (Pmode, l1), + "Language Specific Data Area"); + } + else + dw2_asm_output_data (size_of_encoded_value (lsda_encoding), + 0, "Language Specific Data Area (none)"); } else - dw2_asm_output_data ((for_eh ? PTR_SIZE : DWARF2_ADDR_SIZE), - 0, "Language Specific Data Area (none)"); + dw2_asm_output_data_uleb128 (0, "Augmentation size"); } /* Loop through the Call Frame Instructions associated with @@ -1876,7 +1936,7 @@ output_call_frame_info (for_eh) /* Pad the FDE out to an address sized boundary. */ ASM_OUTPUT_ALIGN (asm_out_file, - floor_log2 ((for_eh ? PTR_SIZE : DWARF2_ADDR_SIZE))); + floor_log2 ((for_eh ? PTR_SIZE : DWARF2_ADDR_SIZE))); ASM_OUTPUT_LABEL (asm_out_file, l2); } |