#include <u.h>
#include <libc.h>
#include <mach.h>
#include "elf.h"

static int
elfsyminit(Fhdr *fp)
{
	int i, onlyundef;
	Elf *elf;
	Symbol sym;
	ElfSym esym;
	ElfProg *p;

	elf = fp->elf;

	onlyundef = fp->nsym > 0;
	for(i=0; elfsym(elf, i, &esym) >= 0; i++){
		if(esym.name == nil)
			continue;
		if(onlyundef && esym.shndx != ElfSymShnNone)
			continue;
		if(esym.type != ElfSymTypeObject && esym.type != ElfSymTypeFunc)
			continue;
		if(strchr(esym.name, '@'))
			continue;
		memset(&sym, 0, sizeof sym);
		sym.name = esym.name;
		sym.loc.type = LADDR;
		sym.loc.addr = esym.value;
		if(esym.size){
			sym.hiloc.type = LADDR;
			sym.hiloc.addr = esym.value+esym.size;
		}
		sym.fhdr = fp;
		if(esym.type==ElfSymTypeObject){
			sym.class = CDATA;
			sym.type = 'D';
			if(&elf->sect[esym.shndx] == elf->bss)
				sym.type = 'B';
		}else if(esym.type==ElfSymTypeFunc){
			sym.class = CTEXT;
			sym.type = 'T';
		}
		if(esym.shndx == ElfSymShnNone)
			sym.type = 'U';
		if(esym.bind==ElfSymBindLocal)
			sym.type += 'a' - 'A';
		addsym(fp, &sym);
	}

	for(i=0; i<elf->nprog; i++){
		p = &elf->prog[i];
		if(p->type != ElfProgDynamic)
			continue;
		memset(&sym, 0, sizeof sym);
		sym.name = "_DYNAMIC";
		sym.loc = locaddr(p->vaddr);
		sym.hiloc = locaddr(p->vaddr+p->filesz);
		sym.type = 'D';
		sym.class = CDATA;
		addsym(fp, &sym);
	}
	return 0;
}

int
symelf(Fhdr *fhdr)
{
	int ret;

	ret = -1;

	/* try dwarf */
	if(fhdr->dwarf){
		if(machdebug)
			fprint(2, "dwarf symbols...\n");
		if(symdwarf(fhdr) < 0)
			fprint(2, "initializing dwarf: %r");
		else
			ret = 0;
	}

	/* try stabs */
	if(fhdr->stabs.stabbase){
		if(machdebug)
			fprint(2, "stabs symbols...\n");
		if(symstabs(fhdr) < 0)
			fprint(2, "initializing stabs: %r");
		else
			ret = 0;
	}

	if(machdebug)
		fprint(2, "elf symbols...\n");

	if(elfsyminit(fhdr) < 0)
		fprint(2, "initializing elf: %r");
	else
		ret = 0;
	return ret;
}

