"I am a person who works hard and plays hard."

Yuan Wei
Second Year Graduate Student Department of Computer Science
University of Virginia Charlottesville, VA 22903
Email: yw3f@cs.virginia.edu


Source Code Analysis

Main Page   Compound List   File List   Compound Members   File Members  

range.h File Reference

#include <stdio.h>
#include "host.h"
#include "misc.h"
#include "machine.h"

Include dependency graph for range.h:

Include dependency graph

This graph shows which files directly or indirectly include this file:

Included by dependency graph

Go to the source code of this file.

Compounds

Enumerations

Functions


Enumeration Type Documentation

enum range_ptype_t
 

Enumeration values:
pt_addr 
pt_inst 
pt_cycle 
pt_NUM 

Definition at line 78 of file range.h.

00078                    {
00079   pt_addr = 0,                  /* address position */
00080   pt_inst,                      /* instruction count position */
00081   pt_cycle,                     /* cycle count position */
00082   pt_NUM
00083 };


Function Documentation

int range_cmp_pos struct range_pos_t   pos,
counter_t    val
 

Definition at line 270 of file range.c.

References counter_t, and range_pos_t::pos.

00272 {
00273   if (val < pos->pos)
00274     return /* before */-1;
00275   else if (val == pos->pos)
00276     return /* equal */0;
00277   else /* if (pos->pos < val) */
00278     return /* after */1;
00279 }

int range_cmp_range struct range_range_t   range,
counter_t    val
 

Definition at line 283 of file range.c.

References counter_t, range_range_t::end, panic(), range_pos_t::pos, range_pos_t::ptype, and range_range_t::start.

Referenced by __check_break().

00285 {
00286   if (range->start.ptype != range->end.ptype)
00287     panic("invalid range");
00288 
00289   if (val < range->start.pos)
00290     return /* before */-1;
00291   else if (range->start.pos <= val && val <= range->end.pos)
00292     return /* inside */0;
00293   else /* if (range->end.pos < val) */
00294     return /* after */1;
00295 }

int range_cmp_range1 struct range_range_t   range,
md_addr_t    addr,
counter_t    icount,
counter_t    cycle
 

Definition at line 299 of file range.c.

References counter_t, range_range_t::end, panic(), range_pos_t::pos, pt_addr, pt_cycle, pt_inst, range_pos_t::ptype, and range_range_t::start.

Referenced by sim_main().

00303 {
00304   if (range->start.ptype != range->end.ptype)
00305     panic("invalid range");
00306 
00307   switch (range->start.ptype)
00308     {
00309     case pt_addr:
00310       if (addr < (md_addr_t)range->start.pos)
00311         return /* before */-1;
00312       else if ((md_addr_t)range->start.pos <= addr && addr <= (md_addr_t)range->end.pos)
00313         return /* inside */0;
00314       else /* if (range->end.pos < addr) */
00315         return /* after */1;
00316       break;
00317     case pt_inst:
00318       if (icount < range->start.pos)
00319         return /* before */-1;
00320       else if (range->start.pos <= icount && icount <= range->end.pos)
00321         return /* inside */0;
00322       else /* if (range->end.pos < icount) */
00323         return /* after */1;
00324       break;
00325     case pt_cycle:
00326       if (cycle < range->start.pos)
00327         return /* before */-1;
00328       else if (range->start.pos <= cycle && cycle <= range->end.pos)
00329         return /* inside */0;
00330       else /* if (range->end.pos < cycle) */
00331         return /* after */1;
00332       break;
00333     default:
00334       panic("bogus range type");
00335     }
00336 }

char* range_parse_pos char *    pstr,
struct range_pos_t   pos
 

Definition at line 90 of file range.c.

References sym_sym_t::addr, FALSE, range_pos_t::pos, pt_addr, pt_cycle, pt_inst, range_pos_t::ptype, s, sdb_any, sym_bind_name(), and sym_loadsyms().

Referenced by range_parse_range().

00092 {
00093   char *s, *endp;
00094   struct sym_sym_t *sym;
00095 #if !defined(__CYGWIN32__)
00096   extern int errno;
00097 #endif
00098 
00099   /* determine position type */
00100   if (pstr[0] == '@')
00101     {
00102       /* address position */
00103       pos->ptype = pt_addr;
00104       s = pstr + 1;
00105     }
00106   else if (pstr[0] == '#')
00107     {
00108       /* cycle count position */
00109       pos->ptype = pt_cycle;
00110       s = pstr + 1;
00111     }
00112   else
00113     {
00114       /* inst count position */
00115       pos->ptype = pt_inst;
00116       s = pstr;
00117     }
00118 
00119   /* get position value */
00120   errno = 0;
00121   pos->pos = (counter_t)strtoul(s, &endp, /* parse base */0);
00122   if (!errno && !*endp)
00123     {
00124       /* good conversion */
00125       return NULL;
00126     }
00127 
00128   /* else, not an integer, attempt double conversion */
00129   errno = 0;
00130   pos->pos = (counter_t)strtod(s, &endp);
00131   if (!errno && !*endp)
00132     {
00133       /* good conversion */
00134       /* FIXME: ignoring decimal point!! */
00135       return NULL;
00136     }
00137 
00138   /* else, attempt symbol lookup */
00139   sym_loadsyms(ld_prog_fname, /* !locals */FALSE);
00140   sym = sym_bind_name(s, NULL, sdb_any);
00141   if (sym != NULL)
00142     {
00143       pos->pos = (counter_t)sym->addr;
00144       return NULL;
00145     }
00146 
00147   /* else, no binding made */
00148   return "cannot bind execution position to a value";
00149 }

char* range_parse_range char *    rstr,
struct range_range_t   range
 

Definition at line 174 of file range.c.

References range_range_t::end, range_pos_t::pos, pt_inst, range_pos_t::ptype, range_parse_pos(), and range_range_t::start.

Referenced by dlite_rbreak(), ptrace_open(), and sim_load_prog().

00176 {
00177   char *pos1, *pos2, *p, buf[512], *errstr;
00178 
00179   /* make a copy of the execution range */
00180   strcpy(buf, rstr);
00181   pos1 = buf;
00182 
00183   /* find mid-point */
00184   p = buf;
00185   while (*p != ':' && *p != '\0')
00186     {
00187       p++;
00188     }
00189   if (*p != ':')
00190     return "badly formed execution range";
00191   *p = '\0';
00192 
00193   /* this is where the second position will start */
00194   pos2 = p + 1;
00195 
00196   /* parse start position */
00197   if (*pos1 && *pos1 != ':')
00198     {
00199       errstr = range_parse_pos(pos1, &range->start);
00200       if (errstr)
00201         return errstr;
00202     }
00203   else
00204     {
00205       /* default start range */
00206       range->start.ptype = pt_inst;
00207       range->start.pos = 0;
00208     }
00209 
00210   /* parse end position */
00211   if (*pos2)
00212     {
00213       if (*pos2 == '+')
00214         {
00215           int delta;
00216           char *endp;
00217 #if !defined(__CYGWIN32__)
00218           extern int errno;
00219 #endif
00220 
00221           /* get delta value */
00222           errno = 0;
00223           delta = strtol(pos2 + 1, &endp, /* parse base */0);
00224           if (!errno && !*endp)
00225             {
00226               /* good conversion */
00227               range->end.ptype = range->start.ptype;
00228               range->end.pos = range->start.pos + delta;
00229             }
00230           else
00231             {
00232               /* bad conversion */
00233               return "badly formed execution range delta";
00234             }
00235         }
00236       else
00237         {
00238           errstr = range_parse_pos(pos2, &range->end);
00239           if (errstr)
00240             return errstr;
00241         }
00242     }
00243   else
00244     {
00245       /* default end range */
00246       range->end.ptype = range->start.ptype;
00247 #ifdef HOST_HAS_QWORD
00248       range->end.pos = ULL(0x7fffffffffffffff);
00249 #else /* !__GNUC__ */
00250       range->end.pos = 281474976645120.0;
00251 #endif /* __GNUC__ */
00252     }
00253 
00254   /* no error */
00255   return NULL;
00256 }

void range_print_pos struct range_pos_t   pos,
FILE *    stream
 

Definition at line 153 of file range.c.

References myfprintf(), panic(), range_pos_t::pos, pt_addr, pt_cycle, pt_inst, and range_pos_t::ptype.

Referenced by range_print_range().

00155 {
00156   switch (pos->ptype)
00157     {
00158     case pt_addr:
00159       myfprintf(stream, "@0x%08p", (md_addr_t)pos->pos);
00160       break;
00161     case pt_inst:
00162       fprintf(stream, "%.0f", (double)pos->pos);
00163       break;
00164     case pt_cycle:
00165       fprintf(stream, "#%.0f", (double)pos->pos);
00166       break;
00167     default:
00168       panic("bogus execution position type");
00169     }
00170 }

void range_print_range struct range_range_t   range,
FILE *    stream
 

Definition at line 260 of file range.c.

References range_range_t::end, range_print_pos(), and range_range_t::start.

Referenced by delete_break(), dlite_breaks(), and set_break().

00262 {
00263   range_print_pos(&range->start, stream);
00264   fprintf(stream, ":");
00265   range_print_pos(&range->end, stream);
00266 }



UVa CS Department of Computer Science
School of Engineering, University of Virginia
151 Engineer's Way, P.O. Box 400740
Charlottesville, Virginia 22904-4740

(434) 982-2200  Fax: (434) 982-2214