00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 #include "config.h"
00043 #include "libdwarfdefs.h"
00044 #include <stdio.h>
00045 #include <string.h>
00046 #ifdef HAVE_ELF_H
00047 #include <elf.h>
00048 #endif
00049 #include "pro_incl.h"
00050 #include "pro_line.h"
00051
00052 Dwarf_Unsigned _dwarf_pro_add_line_entry(Dwarf_P_Debug,
00053 Dwarf_Unsigned file_index,
00054 Dwarf_Addr code_address,
00055 Dwarf_Unsigned symidx,
00056 Dwarf_Unsigned line_no,
00057 Dwarf_Signed col_no,
00058 Dwarf_Bool is_stmt_begin,
00059 Dwarf_Bool is_bb_begin,
00060 Dwarf_Ubyte opc,
00061 Dwarf_Error * error);
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073 Dwarf_Unsigned
00074 dwarf_add_line_entry(Dwarf_P_Debug dbg,
00075 Dwarf_Unsigned file_index,
00076 Dwarf_Addr code_address,
00077 Dwarf_Unsigned line_no,
00078 Dwarf_Signed col_no,
00079 Dwarf_Bool is_stmt_begin,
00080 Dwarf_Bool is_bb_begin, Dwarf_Error * error)
00081 {
00082 Dwarf_Unsigned retval;
00083
00084 retval = _dwarf_pro_add_line_entry(dbg, file_index, code_address, 0,
00085 line_no, col_no, is_stmt_begin,
00086 is_bb_begin, 0, error);
00087 return retval;
00088 }
00089
00090
00091
00092
00093
00094
00095 Dwarf_Unsigned
00096 dwarf_lne_set_address(Dwarf_P_Debug dbg,
00097 Dwarf_Addr offs,
00098 Dwarf_Unsigned symidx, Dwarf_Error * error)
00099 {
00100 Dwarf_Ubyte opc;
00101 Dwarf_Unsigned retval;
00102
00103 opc = DW_LNE_set_address;
00104 retval =
00105 _dwarf_pro_add_line_entry(dbg, 0, offs, symidx, 0, 0, 0, 0, opc,
00106 error);
00107 return retval;
00108 }
00109
00110
00111
00112
00113
00114
00115 Dwarf_Unsigned
00116 dwarf_lne_end_sequence(Dwarf_P_Debug dbg,
00117 Dwarf_Addr end_address, Dwarf_Error * error)
00118 {
00119 Dwarf_Ubyte opc;
00120 Dwarf_Unsigned retval;
00121
00122 opc = DW_LNE_end_sequence;
00123 retval =
00124 _dwarf_pro_add_line_entry(dbg, 0, end_address, 0, 0, 0, 0, 0,
00125 opc, error);
00126 return retval;
00127 }
00128
00129
00130
00131
00132
00133
00134
00135 Dwarf_Unsigned
00136 _dwarf_pro_add_line_entry(Dwarf_P_Debug dbg,
00137 Dwarf_Unsigned file_index,
00138 Dwarf_Addr code_address,
00139 Dwarf_Unsigned symidx,
00140 Dwarf_Unsigned line_no,
00141 Dwarf_Signed col_no,
00142 Dwarf_Bool is_stmt_begin,
00143 Dwarf_Bool is_bb_begin,
00144 Dwarf_Ubyte opc, Dwarf_Error * error)
00145 {
00146 if (dbg->de_lines == NULL) {
00147 dbg->de_lines = (Dwarf_P_Line)
00148 _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Line_s));
00149 if (dbg->de_lines == NULL) {
00150 DWARF_P_DBG_ERROR(dbg, DW_DLE_LINE_ALLOC, DW_DLV_NOCOUNT);
00151 }
00152 dbg->de_last_line = dbg->de_lines;
00153 _dwarf_pro_reg_init(dbg->de_lines);
00154
00155 } else {
00156 dbg->de_last_line->dpl_next = (Dwarf_P_Line)
00157 _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Line_s));
00158 if (dbg->de_last_line->dpl_next == NULL) {
00159 DWARF_P_DBG_ERROR(dbg, DW_DLE_LINE_ALLOC, DW_DLV_NOCOUNT);
00160 }
00161 dbg->de_last_line = dbg->de_last_line->dpl_next;
00162 _dwarf_pro_reg_init(dbg->de_last_line);
00163 }
00164 dbg->de_last_line->dpl_address = code_address;
00165 dbg->de_last_line->dpl_file = (unsigned long) file_index;
00166 dbg->de_last_line->dpl_line = (unsigned long) line_no;
00167 dbg->de_last_line->dpl_column = (unsigned long) col_no;
00168 dbg->de_last_line->dpl_is_stmt = is_stmt_begin;
00169 dbg->de_last_line->dpl_basic_block = is_bb_begin;
00170 dbg->de_last_line->dpl_opc = opc;
00171 dbg->de_last_line->dpl_r_symidx = symidx;
00172
00173 return (0);
00174 }
00175
00176
00177
00178
00179
00180 Dwarf_Unsigned
00181 dwarf_add_directory_decl(Dwarf_P_Debug dbg,
00182 const char *name, Dwarf_Error * error)
00183 {
00184 if (dbg->de_inc_dirs == NULL) {
00185 dbg->de_inc_dirs = (Dwarf_P_Inc_Dir)
00186 _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Inc_Dir_s));
00187 if (dbg->de_inc_dirs == NULL) {
00188 DWARF_P_DBG_ERROR(dbg, DW_DLE_INCDIR_ALLOC, DW_DLV_NOCOUNT);
00189 }
00190 dbg->de_last_inc_dir = dbg->de_inc_dirs;
00191 dbg->de_n_inc_dirs = 1;
00192 } else {
00193 dbg->de_last_inc_dir->did_next = (Dwarf_P_Inc_Dir)
00194 _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Inc_Dir_s));
00195 if (dbg->de_last_inc_dir->did_next == NULL) {
00196 DWARF_P_DBG_ERROR(dbg, DW_DLE_INCDIR_ALLOC, DW_DLV_NOCOUNT);
00197 }
00198 dbg->de_last_inc_dir = dbg->de_last_inc_dir->did_next;
00199 dbg->de_n_inc_dirs++;
00200 }
00201 dbg->de_last_inc_dir->did_name =
00202 (char *) _dwarf_p_get_alloc(dbg, strlen(name) + 1);
00203 if (dbg->de_last_inc_dir->did_name == NULL) {
00204 DWARF_P_DBG_ERROR(dbg, DW_DLE_STRING_ALLOC, DW_DLV_NOCOUNT);
00205 }
00206 strcpy(dbg->de_last_inc_dir->did_name, name);
00207 dbg->de_last_inc_dir->did_next = NULL;
00208
00209 return dbg->de_n_inc_dirs;
00210 }
00211
00212
00213
00214
00215
00216
00217 Dwarf_Unsigned
00218 dwarf_add_file_decl(Dwarf_P_Debug dbg,
00219 const char *name,
00220 Dwarf_Unsigned dir_idx,
00221 Dwarf_Unsigned time_mod,
00222 Dwarf_Unsigned length, Dwarf_Error * error)
00223 {
00224 Dwarf_P_F_Entry cur;
00225 char *ptr;
00226 int nbytes_idx, nbytes_time, nbytes_len;
00227 char buffidx[ENCODE_SPACE_NEEDED];
00228 char bufftime[ENCODE_SPACE_NEEDED];
00229 char bufflen[ENCODE_SPACE_NEEDED];
00230 int res;
00231
00232 if (dbg->de_file_entries == NULL) {
00233 dbg->de_file_entries = (Dwarf_P_F_Entry)
00234 _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_F_Entry_s));
00235 if (dbg->de_file_entries == NULL) {
00236 DWARF_P_DBG_ERROR(dbg, DW_DLE_FILE_ENTRY_ALLOC,
00237 DW_DLV_NOCOUNT);
00238 }
00239 cur = dbg->de_file_entries;
00240 dbg->de_last_file_entry = cur;
00241 dbg->de_n_file_entries = 1;
00242 } else {
00243 cur = dbg->de_last_file_entry;
00244 cur->dfe_next = (Dwarf_P_F_Entry)
00245 _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_F_Entry_s));
00246 if (cur->dfe_next == NULL) {
00247 DWARF_P_DBG_ERROR(dbg, DW_DLE_FILE_ENTRY_ALLOC,
00248 DW_DLV_NOCOUNT);
00249 }
00250 cur = cur->dfe_next;
00251 dbg->de_last_file_entry = cur;
00252 dbg->de_n_file_entries++;
00253 }
00254 cur->dfe_name = (char *) _dwarf_p_get_alloc(dbg, strlen(name) + 1);
00255 if (cur->dfe_name == NULL) {
00256 DWARF_P_DBG_ERROR(dbg, DW_DLE_ALLOC_FAIL, DW_DLV_NOCOUNT);
00257 }
00258 strcpy((char *) cur->dfe_name, name);
00259 res = _dwarf_pro_encode_leb128_nm(dir_idx, &nbytes_idx,
00260 buffidx, sizeof(buffidx));
00261 if (res != DW_DLV_OK) {
00262 DWARF_P_DBG_ERROR(dbg, DW_DLE_ALLOC_FAIL, DW_DLV_NOCOUNT);
00263 }
00264 res = _dwarf_pro_encode_leb128_nm(time_mod, &nbytes_time,
00265 bufftime, sizeof(bufftime));
00266 if (res != DW_DLV_OK) {
00267 DWARF_P_DBG_ERROR(dbg, DW_DLE_ALLOC_FAIL, DW_DLV_NOCOUNT);
00268 }
00269 res = _dwarf_pro_encode_leb128_nm(length, &nbytes_len,
00270 bufflen, sizeof(bufflen));
00271 cur->dfe_args = (char *)
00272 _dwarf_p_get_alloc(dbg, nbytes_idx + nbytes_time + nbytes_len);
00273 if (cur->dfe_args == NULL) {
00274 DWARF_P_DBG_ERROR(dbg, DW_DLE_ALLOC_FAIL, DW_DLV_NOCOUNT);
00275 }
00276 ptr = cur->dfe_args;
00277 memcpy((void *) ptr, buffidx, nbytes_idx);
00278 ptr += nbytes_idx;
00279 memcpy((void *) ptr, bufftime, nbytes_time);
00280 ptr += nbytes_time;
00281 memcpy((void *) ptr, bufflen, nbytes_len);
00282 ptr += nbytes_len;
00283 cur->dfe_nbytes = nbytes_idx + nbytes_time + nbytes_len;
00284 cur->dfe_next = NULL;
00285
00286 return dbg->de_n_file_entries;
00287 }
00288
00289
00290
00291
00292
00293
00294 void
00295 _dwarf_pro_reg_init(Dwarf_P_Line cur_line)
00296 {
00297 cur_line->dpl_address = 0;
00298 cur_line->dpl_file = 1;
00299 cur_line->dpl_line = 1;
00300 cur_line->dpl_column = 0;
00301 cur_line->dpl_is_stmt = DEFAULT_IS_STMT;
00302 cur_line->dpl_basic_block = false;
00303 cur_line->dpl_next = NULL;
00304 }