scc

simple c99 compiler
git clone git://git.simple-cc.org/scc
Log | Files | Refs | Submodules | README | LICENSE

coff32getsym.c (1337B)


      1 #include <ctype.h>
      2 #include <stdio.h>
      3 #include <string.h>
      4 
      5 #include <scc/mach.h>
      6 
      7 #include "../libmach.h"
      8 #include "coff32.h"
      9 
     10 static int
     11 typeof(Coff32 *coff, SYMENT *ent)
     12 {
     13 	int c;
     14 	SCNHDR *scn;
     15 
     16 	switch (ent->n_scnum) {
     17 	case N_DEBUG:
     18 		c = 'N';
     19 		break;
     20 	case N_ABS:
     21 		c = 'a';
     22 		break;
     23 	case N_UNDEF:
     24 		c = (ent->n_value != 0) ? 'C' : 'U';
     25 		break;
     26 	default:
     27 		scn = &coff->scns[ent->n_scnum-1];
     28 
     29 		switch (scn->s_flags) {
     30 		case STYP_TEXT:
     31 			c = 't';
     32 			break;
     33 		case STYP_DATA:
     34 			c = 'd';
     35 			break;
     36 		case STYP_BSS:
     37 			c = 'b';
     38 			break;
     39 		case STYP_INFO:
     40 			c = 'N';
     41 			break;
     42 		case STYP_LIT:
     43 			c = 'r';
     44 			break;
     45 		default:
     46 			c = '?';
     47 			break;
     48 		}
     49 	}
     50 
     51 	if (ent->n_sclass == C_EXT)
     52 		c = toupper(c);
     53 
     54 	return c;
     55 }
     56 
     57 static char *
     58 symname(Coff32 *coff, SYMENT *ent)
     59 {
     60 	if (ent->n_zeroes != 0)
     61 		return ent->n_name;
     62 
     63 	return &coff->strtbl[ent->n_offset];
     64 }
     65 
     66 Symbol *
     67 coff32getsym(Obj *obj, int *idx, Symbol *sym)
     68 {
     69 	int n = *idx;
     70 	SYMENT *ent;
     71 	Coff32 *coff = obj->data;
     72 	FILHDR *hdr = &coff->hdr;
     73 
     74 	if ((hdr->f_flags & F_LSYMS) != 0 || n >= coff->hdr.f_nsyms)
     75 		return NULL;
     76 
     77 	ent = &coff->ents[n];
     78 	sym->name = symname(coff, ent);
     79 	sym->type = typeof(coff, ent);
     80 	sym->stype = SYMOBJECT;
     81 	sym->value = ent->n_value;
     82 	sym->size = (sym->type == 'C') ? ent->n_value : 0;
     83 	sym->index = n;
     84 	*idx += ent->n_numaux;
     85 
     86 	return sym;
     87 }