1 /* extracted from gdb sources */
2 
3 typedef unsigned long long CORE_ADDR;
4 
5 struct blockvector;
6 
7 struct symtab {
8   struct blockvector *blockvector;
9 };
10 
11 struct sec {
12   void *unused;
13 };
14 
15 struct symbol {
16   int len;
17   char *name;
18 };
19 
20 struct block {
21 	CORE_ADDR startaddr, endaddr;
22 	struct symbol *function;
23 	struct block *superblock;
24 	unsigned char gcc_compile_flag;
25 	int nsyms;
26 	struct symbol syms[1];
27 };
28 
29 struct blockvector {
30 	int nblocks;
31 	struct block *block[2];
32 };
33 
blockvector_for_pc_sect(register CORE_ADDR pc,struct symtab * symtab)34 struct blockvector *blockvector_for_pc_sect(register CORE_ADDR pc,
35 					    struct symtab *symtab)
36 {
37   register struct block *b;
38   register int bot, top, half;
39   struct blockvector *bl;
40 
41   bl = symtab->blockvector;
42   b = bl->block[0];
43 
44   bot = 0;
45   top = bl->nblocks;
46 
47   while (top - bot > 1)
48     {
49       half = (top - bot + 1) >> 1;
50       b = bl->block[bot + half];
51       if (b->startaddr <= pc)
52 	bot += half;
53       else
54 	top = bot + half;
55     }
56 
57   while (bot >= 0)
58     {
59       b = bl->block[bot];
60       if (b->endaddr > pc)
61 	{
62 	  return bl;
63 	}
64       bot--;
65     }
66   return 0;
67 }
68 
main(void)69 int main(void)
70 {
71   struct block a = { 0, 0x10000, 0, 0, 1, 20 };
72   struct block b = { 0x10000, 0x20000, 0, 0, 1, 20 };
73   struct blockvector bv = { 2, { &a, &b } };
74   struct symtab s = { &bv };
75 
76   struct blockvector *ret;
77 
78   ret = blockvector_for_pc_sect(0x500, &s);
79 
80   return 0;
81 }
82