00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "config.h"
00021 #include "config.h"
00022 #include "dwarf_stuff.h"
00023 #include "libdwarfdefs.h"
00024 #include <stdio.h>
00025 #include <stdlib.h>
00026 #include <string.h>
00027 #include <limits.h>
00028 #include "pro_incl.h"
00029 #include "pro_frame.h"
00030
00031 Dwarf_Bool generate_fpic_dwarf;
00032 Dwarf_Bool generate_m64_dwarf;
00033
00034 Dwarf_Unsigned
00035 dwf_add_frame_cie(Dwarf_P_Debug dbg,
00036 const char *augmenter,
00037 Dwarf_Small code_align,
00038 Dwarf_Small data_align,
00039 Dwarf_Small return_reg,
00040 Dwarf_Unsigned personality,
00041 Dwarf_Bool pic,
00042 Dwarf_Bool is_64bit,
00043 Dwarf_Ptr init_bytes,
00044 Dwarf_Unsigned init_n_bytes,
00045 Dwarf_Error * error)
00046 {
00047 generate_fpic_dwarf = pic;
00048 generate_m64_dwarf = is_64bit;
00049
00050 if (personality) {
00051 fprintf(stderr, "Implement personality %ud\n",
00052 (unsigned int) personality);
00053 abort();
00054 }
00055
00056 return dwarf_add_frame_cie(dbg, augmenter, code_align, data_align,
00057 return_reg,
00058 init_bytes,
00059 init_n_bytes,
00060 error);
00061 }
00062
00063 Dwarf_Unsigned
00064 dwf_add_ehframe_cie(Dwarf_P_Debug dbg,
00065 const char *augmenter,
00066 Dwarf_Small code_align,
00067 Dwarf_Small data_align,
00068 Dwarf_Small return_reg,
00069 Dwarf_Unsigned personality,
00070 Dwarf_Bool fpic,
00071 Dwarf_Bool is_64bit,
00072 Dwarf_Ptr init_bytes,
00073 Dwarf_Unsigned init_n_bytes,
00074 Dwarf_Error *error)
00075 {
00076 Dwarf_P_Cie curcie;
00077 generate_fpic_dwarf = fpic;
00078 generate_m64_dwarf = is_64bit;
00079
00080 if (dbg->de_eh_frame_cies == NULL) {
00081 dbg->de_eh_frame_cies = (Dwarf_P_Cie)
00082 _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Cie_s));
00083 if (dbg->de_eh_frame_cies == NULL) {
00084 DWARF_P_DBG_ERROR(dbg,DW_DLE_CIE_ALLOC,DW_DLV_NOCOUNT);
00085 }
00086 curcie = dbg->de_eh_frame_cies;
00087 dbg->de_eh_n_cie = 1;
00088 dbg->de_eh_last_cie = curcie;
00089 }
00090 else {
00091 curcie = dbg->de_eh_last_cie;
00092 curcie->cie_next = (Dwarf_P_Cie)
00093 _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Cie_s));
00094 if (curcie->cie_next == NULL) {
00095 DWARF_P_DBG_ERROR(dbg,DW_DLE_CIE_ALLOC,DW_DLV_NOCOUNT);
00096 }
00097 curcie = curcie->cie_next;
00098 dbg->de_eh_n_cie++;
00099 dbg->de_eh_last_cie = curcie;
00100 }
00101 curcie->cie_version = DW_CIE_VERSION;
00102 curcie->cie_aug = augmenter;
00103 curcie->cie_code_align = code_align;
00104 curcie->cie_data_align = data_align;
00105 curcie->cie_ret_reg = return_reg;
00106 curcie->cie_personality = personality;
00107 curcie->cie_inst = (char *) init_bytes;
00108 curcie->cie_inst_bytes = (long)init_n_bytes;
00109 curcie->cie_next = NULL;
00110 return dbg->de_eh_n_cie;
00111 }
00112
00113
00114 Dwarf_Unsigned
00115 dwf_add_ehframe_fde(Dwarf_P_Debug dbg,
00116 Dwarf_P_Fde fde,
00117 Dwarf_P_Die die,
00118 Dwarf_Unsigned cie,
00119 Dwarf_Unsigned virt_addr,
00120 Dwarf_Unsigned code_len,
00121 Dwarf_Unsigned symidx,
00122 Dwarf_Error *error)
00123 {
00124 return dwf_add_ehframe_fde_b(dbg, fde, die, cie, virt_addr,
00125 code_len, symidx, 0, 0, error);
00126 }
00127
00128
00129 Dwarf_Unsigned
00130 dwf_add_ehframe_fde_b(Dwarf_P_Debug dbg,
00131 Dwarf_P_Fde fde,
00132 Dwarf_P_Die die,
00133 Dwarf_Unsigned cie,
00134 Dwarf_Unsigned virt_addr,
00135 Dwarf_Unsigned code_len,
00136 Dwarf_Unsigned symidx,
00137 Dwarf_Unsigned symidx_of_end,
00138 Dwarf_Addr offset_from_end_sym,
00139 Dwarf_Error *error)
00140 {
00141 Dwarf_P_Fde curfde;
00142
00143 fde->fde_die = die;
00144 fde->fde_cie = (long)cie;
00145 fde->fde_initloc = virt_addr;
00146 fde->fde_r_symidx = symidx;
00147 fde->fde_addr_range = code_len;
00148 fde->fde_offset_into_exception_tables = DW_DLX_NO_EH_OFFSET;
00149 fde->fde_exception_table_symbol = 0;
00150 fde->fde_end_symbol_offset = offset_from_end_sym;
00151 fde->fde_end_symbol = symidx_of_end;
00152
00153 curfde = dbg->de_eh_last_fde;
00154 if (curfde == NULL) {
00155 dbg->de_eh_frame_fdes = fde;
00156 dbg->de_eh_last_fde = fde;
00157 dbg->de_eh_n_fde = 1;
00158 }
00159 else {
00160 curfde->fde_next = fde;
00161 dbg->de_eh_last_fde = fde;
00162 dbg->de_eh_n_fde++;
00163 }
00164 return dbg->de_eh_n_fde;
00165 }
00166
00167 Dwarf_Unsigned
00168 dwf_add_ehframe_info(Dwarf_P_Debug dbg,
00169 Dwarf_P_Fde fde,
00170 Dwarf_P_Die die,
00171 Dwarf_Unsigned cie,
00172 Dwarf_Unsigned virt_addr,
00173 Dwarf_Unsigned code_len,
00174 Dwarf_Unsigned symidx,
00175 Dwarf_Signed offset_into_exception_tables,
00176 Dwarf_Unsigned exception_table_symbol,
00177 Dwarf_Error *error)
00178 {
00179 return dwf_add_ehframe_info_b(
00180 dbg,fde,die,cie,virt_addr,
00181 code_len,
00182 symidx,
00183 0,
00184 0,
00185 offset_into_exception_tables,
00186 exception_table_symbol,
00187 error);
00188
00189 }
00190
00191
00192 Dwarf_Unsigned
00193 dwf_add_ehframe_info_b(Dwarf_P_Debug dbg,
00194 Dwarf_P_Fde fde,
00195 Dwarf_P_Die die,
00196 Dwarf_Unsigned cie,
00197 Dwarf_Unsigned virt_addr,
00198 Dwarf_Unsigned code_len,
00199 Dwarf_Unsigned symidx,
00200 Dwarf_Unsigned end_symidx,
00201 Dwarf_Unsigned offset_from_end_symbol,
00202 Dwarf_Signed offset_into_exception_tables,
00203 Dwarf_Unsigned exception_table_symbol,
00204 Dwarf_Error *error)
00205 {
00206 Dwarf_P_Fde curfde;
00207
00208 fde->fde_die = die;
00209 fde->fde_cie = (long)cie;
00210 fde->fde_initloc = virt_addr;
00211 fde->fde_r_symidx = symidx;
00212 fde->fde_addr_range = code_len;
00213 fde->fde_offset_into_exception_tables = offset_into_exception_tables;
00214 fde->fde_exception_table_symbol = exception_table_symbol;
00215 fde->fde_end_symbol_offset = offset_from_end_symbol;
00216 fde->fde_end_symbol = end_symidx;
00217
00218
00219 curfde = dbg->de_eh_last_fde;
00220 if (curfde == NULL) {
00221 dbg->de_eh_frame_fdes = fde;
00222 dbg->de_eh_last_fde = fde;
00223 dbg->de_eh_n_fde = 1;
00224 }
00225 else {
00226 curfde->fde_next = fde;
00227 dbg->de_eh_last_fde = fde;
00228 dbg->de_eh_n_fde++;
00229 }
00230 return dbg->de_eh_n_fde;
00231 }