|  | typedef struct Dwarf Dwarf; | 
|  | typedef struct DwarfAttrs DwarfAttrs; | 
|  | typedef struct DwarfBlock DwarfBlock; | 
|  | typedef struct DwarfBuf DwarfBuf; | 
|  | typedef struct DwarfExpr DwarfExpr; | 
|  | typedef struct DwarfSym DwarfSym; | 
|  | typedef union DwarfVal DwarfVal; | 
|  |  | 
|  | enum | 
|  | { | 
|  | TagArrayType = 0x01, | 
|  | TagClassType = 0x02, | 
|  | TagEntryPoint = 0x03, | 
|  | TagEnumerationType = 0x04, | 
|  | TagFormalParameter = 0x05, | 
|  | TagImportedDeclaration = 0x08, | 
|  | TagLabel = 0x0A, | 
|  | TagLexDwarfBlock = 0x0B, | 
|  | TagMember = 0x0D, | 
|  | TagPointerType = 0x0F, | 
|  | TagReferenceType = 0x10, | 
|  | TagCompileUnit = 0x11, | 
|  | TagStringType = 0x12, | 
|  | TagStructType = 0x13, | 
|  | TagSubroutineType = 0x15, | 
|  | TagTypedef = 0x16, | 
|  | TagUnionType = 0x17, | 
|  | TagUnspecifiedParameters = 0x18, | 
|  | TagVariant = 0x19, | 
|  | TagCommonDwarfBlock = 0x1A, | 
|  | TagCommonInclusion = 0x1B, | 
|  | TagInheritance = 0x1C, | 
|  | TagInlinedSubroutine = 0x1D, | 
|  | TagModule = 0x1E, | 
|  | TagPtrToMemberType = 0x1F, | 
|  | TagSetType = 0x20, | 
|  | TagSubrangeType = 0x21, | 
|  | TagWithStmt = 0x22, | 
|  | TagAccessDeclaration = 0x23, | 
|  | TagBaseType = 0x24, | 
|  | TagCatchDwarfBlock = 0x25, | 
|  | TagConstType = 0x26, | 
|  | TagConstant = 0x27, | 
|  | TagEnumerator = 0x28, | 
|  | TagFileType = 0x29, | 
|  | TagFriend = 0x2A, | 
|  | TagNamelist = 0x2B, | 
|  | TagNamelistItem = 0x2C, | 
|  | TagPackedType = 0x2D, | 
|  | TagSubprogram = 0x2E, | 
|  | TagTemplateTypeParameter = 0x2F, | 
|  | TagTemplateValueParameter = 0x30, | 
|  | TagThrownType = 0x31, | 
|  | TagTryDwarfBlock = 0x32, | 
|  | TagVariantPart = 0x33, | 
|  | TagVariable = 0x34, | 
|  | TagVolatileType = 0x35, | 
|  | TagDwarfProcedure = 0x36, | 
|  | TagRestrictType = 0x37, | 
|  | TagInterfaceType = 0x38, | 
|  | TagNamespace = 0x39, | 
|  | TagImportedModule = 0x3A, | 
|  | TagUnspecifiedType = 0x3B, | 
|  | TagPartialUnit = 0x3C, | 
|  | TagImportedUnit = 0x3D, | 
|  | TagMutableType = 0x3E, | 
|  |  | 
|  | TypeAddress = 0x01, | 
|  | TypeBoolean = 0x02, | 
|  | TypeComplexFloat = 0x03, | 
|  | TypeFloat = 0x04, | 
|  | TypeSigned = 0x05, | 
|  | TypeSignedChar = 0x06, | 
|  | TypeUnsigned = 0x07, | 
|  | TypeUnsignedChar = 0x08, | 
|  | TypeImaginaryFloat = 0x09, | 
|  |  | 
|  | AccessPublic = 0x01, | 
|  | AccessProtected = 0x02, | 
|  | AccessPrivate = 0x03, | 
|  |  | 
|  | VisLocal = 0x01, | 
|  | VisExported = 0x02, | 
|  | VisQualified = 0x03, | 
|  |  | 
|  | VirtNone = 0x00, | 
|  | VirtVirtual = 0x01, | 
|  | VirtPureVirtual = 0x02, | 
|  |  | 
|  | LangC89 = 0x0001, | 
|  | LangC = 0x0002, | 
|  | LangAda83 = 0x0003, | 
|  | LangCplusplus = 0x0004, | 
|  | LangCobol74 = 0x0005, | 
|  | LangCobol85 = 0x0006, | 
|  | LangFortran77 = 0x0007, | 
|  | LangFortran90 = 0x0008, | 
|  | LangPascal83 = 0x0009, | 
|  | LangModula2 = 0x000A, | 
|  | LangJava = 0x000B, | 
|  | LangC99 = 0x000C, | 
|  | LangAda95 = 0x000D, | 
|  | LangFortran95 = 0x000E, | 
|  | LangPLI = 0x000F, | 
|  | /* 0x8000-0xFFFF reserved */ | 
|  |  | 
|  | IdCaseSensitive = 0x00, | 
|  | IdCaseUpper = 0x01, | 
|  | IdCaseLower = 0x02, | 
|  | IdCaseInsensitive = 0x03, | 
|  |  | 
|  | CallingNormal = 0x01, | 
|  | CallingProgram = 0x02, | 
|  | CallingNocall = 0x03, | 
|  | /* 0x40-0xFF reserved */ | 
|  |  | 
|  | InNone = 0x00, | 
|  | InInlined = 0x01, | 
|  | InDeclaredNotInlined = 0x02, | 
|  | InDeclaredInlined = 0x03, | 
|  |  | 
|  | OrderRowMajor = 0x00, | 
|  | OrderColumnMajor = 0x01, | 
|  |  | 
|  | DiscLabel = 0x00, | 
|  | DiscRange = 0x01, | 
|  |  | 
|  | TReference = 1<<0, | 
|  | TBlock = 1<<1, | 
|  | TConstant = 1<<2, | 
|  | TString = 1<<3, | 
|  | TFlag = 1<<4, | 
|  | TAddress = 1<<5, | 
|  |  | 
|  | OpAddr = 0x03,	/* 1 op, const addr */ | 
|  | OpDeref = 0x06, | 
|  | OpConst1u = 0x08,	/* 1 op, 1 byte const */ | 
|  | OpConst1s = 0x09,	/*	" signed */ | 
|  | OpConst2u = 0x0A,	/* 1 op, 2 byte const  */ | 
|  | OpConst2s = 0x0B,	/*	" signed */ | 
|  | OpConst4u = 0x0C,	/* 1 op, 4 byte const */ | 
|  | OpConst4s = 0x0D,	/*	" signed */ | 
|  | OpConst8u = 0x0E,	/* 1 op, 8 byte const */ | 
|  | OpConst8s = 0x0F,	/*	" signed */ | 
|  | OpConstu = 0x10,	/* 1 op, LEB128 const */ | 
|  | OpConsts = 0x11,	/*	" signed */ | 
|  | OpDup = 0x12, | 
|  | OpDrop = 0x13, | 
|  | OpOver = 0x14, | 
|  | OpPick = 0x15,		/* 1 op, 1 byte stack index */ | 
|  | OpSwap = 0x16, | 
|  | OpRot = 0x17, | 
|  | OpXderef = 0x18, | 
|  | OpAbs = 0x19, | 
|  | OpAnd = 0x1A, | 
|  | OpDiv = 0x1B, | 
|  | OpMinus = 0x1C, | 
|  | OpMod = 0x1D, | 
|  | OpMul = 0x1E, | 
|  | OpNeg = 0x1F, | 
|  | OpNot = 0x20, | 
|  | OpOr = 0x21, | 
|  | OpPlus = 0x22, | 
|  | OpPlusUconst = 0x23,	/* 1 op, ULEB128 addend */ | 
|  | OpShl = 0x24, | 
|  | OpShr = 0x25, | 
|  | OpShra = 0x26, | 
|  | OpXor = 0x27, | 
|  | OpSkip = 0x2F,		/* 1 op, signed 2-byte constant */ | 
|  | OpBra = 0x28,		/* 1 op, signed 2-byte constant */ | 
|  | OpEq = 0x29, | 
|  | OpGe = 0x2A, | 
|  | OpGt = 0x2B, | 
|  | OpLe = 0x2C, | 
|  | OpLt = 0x2D, | 
|  | OpNe = 0x2E, | 
|  | OpLit0 = 0x30, | 
|  | /* OpLitN = OpLit0 + N for N = 0..31 */ | 
|  | OpReg0 = 0x50, | 
|  | /* OpRegN = OpReg0 + N for N = 0..31 */ | 
|  | OpBreg0 = 0x70,	/* 1 op, signed LEB128 constant */ | 
|  | /* OpBregN = OpBreg0 + N for N = 0..31 */ | 
|  | OpRegx = 0x90,	/* 1 op, ULEB128 register */ | 
|  | OpFbreg = 0x91,	/* 1 op, SLEB128 offset */ | 
|  | OpBregx = 0x92,	/* 2 op, ULEB128 reg, SLEB128 off */ | 
|  | OpPiece = 0x93,	/* 1 op, ULEB128 size of piece */ | 
|  | OpDerefSize = 0x94,	/* 1-byte size of data retrieved */ | 
|  | OpXderefSize = 0x95,	/* 1-byte size of data retrieved */ | 
|  | OpNop = 0x96, | 
|  | /* next four new in Dwarf v3 */ | 
|  | OpPushObjAddr = 0x97, | 
|  | OpCall2 = 0x98,	/* 2-byte offset of DIE */ | 
|  | OpCall4 = 0x99,	/* 4-byte offset of DIE */ | 
|  | OpCallRef = 0x9A	/* 4- or 8- byte offset of DIE */ | 
|  | /* 0xE0-0xFF reserved for user-specific */ | 
|  | }; | 
|  |  | 
|  | struct DwarfBlock | 
|  | { | 
|  | uchar *data; | 
|  | ulong len; | 
|  | }; | 
|  |  | 
|  | /* not for consumer use */ | 
|  | struct DwarfBuf | 
|  | { | 
|  | Dwarf *d; | 
|  | uchar *p; | 
|  | uchar *ep; | 
|  | uint addrsize; | 
|  | }; | 
|  |  | 
|  | union DwarfVal | 
|  | { | 
|  | char *s; | 
|  | ulong c; | 
|  | ulong r; | 
|  | DwarfBlock b; | 
|  | }; | 
|  |  | 
|  | struct DwarfAttrs | 
|  | { | 
|  | ulong	tag; | 
|  | uchar	haskids; | 
|  |  | 
|  | /* whether we have it, along with type */ | 
|  | struct { | 
|  | uchar	abstractorigin; | 
|  | uchar	accessibility; | 
|  | uchar	addrclass; | 
|  | uchar	basetypes; | 
|  | uchar	bitoffset; | 
|  | uchar	bitsize; | 
|  | uchar	bytesize; | 
|  | uchar	calling; | 
|  | uchar	commonref; | 
|  | uchar	compdir; | 
|  | uchar	constvalue; | 
|  | uchar	containingtype; | 
|  | uchar	count; | 
|  | uchar	datamemberloc; | 
|  | uchar	declcolumn; | 
|  | uchar	declfile; | 
|  | uchar	declline; | 
|  | uchar	defaultvalue; | 
|  | uchar	discr; | 
|  | uchar	discrlist; | 
|  | uchar	discrvalue; | 
|  | uchar	encoding; | 
|  | uchar	framebase; | 
|  | uchar	friend; | 
|  | uchar	highpc; | 
|  | uchar	identifiercase; | 
|  | uchar	import; | 
|  | uchar	inlined; | 
|  | uchar	isartificial; | 
|  | uchar	isdeclaration; | 
|  | uchar	isexternal; | 
|  | uchar	isoptional; | 
|  | uchar	isprototyped; | 
|  | uchar	isvarparam; | 
|  | uchar	language; | 
|  | uchar	location; | 
|  | uchar	lowerbound; | 
|  | uchar	lowpc; | 
|  | uchar	macroinfo; | 
|  | uchar	name; | 
|  | uchar	namelistitem; | 
|  | uchar	ordering; | 
|  | uchar	priority; | 
|  | uchar	producer; | 
|  | uchar	ranges; | 
|  | uchar	returnaddr; | 
|  | uchar	segment; | 
|  | uchar	sibling; | 
|  | uchar	specification; | 
|  | uchar	startscope; | 
|  | uchar	staticlink; | 
|  | uchar	stmtlist; | 
|  | uchar	stridesize; | 
|  | uchar	stringlength; | 
|  | uchar	type; | 
|  | uchar	upperbound; | 
|  | uchar	uselocation; | 
|  | uchar	virtuality; | 
|  | uchar	visibility; | 
|  | uchar	vtableelemloc; | 
|  | } have; | 
|  |  | 
|  | ulong	abstractorigin; | 
|  | ulong	accessibility; | 
|  | ulong	addrclass; | 
|  | ulong	basetypes; | 
|  | ulong	bitoffset; | 
|  | ulong	bitsize; | 
|  | ulong	bytesize; | 
|  | ulong	calling; | 
|  | ulong	commonref; | 
|  | char*	compdir; | 
|  | DwarfVal	constvalue; | 
|  | ulong	containingtype; | 
|  | ulong	count; | 
|  | DwarfVal	datamemberloc; | 
|  | ulong	declcolumn; | 
|  | ulong	declfile; | 
|  | ulong	declline; | 
|  | ulong	defaultvalue; | 
|  | ulong	discr; | 
|  | DwarfBlock	discrlist; | 
|  | ulong	discrvalue; | 
|  | ulong	encoding; | 
|  | DwarfVal	framebase; | 
|  | ulong	friend; | 
|  | ulong	highpc; | 
|  | ulong	identifiercase; | 
|  | ulong	import; | 
|  | ulong	inlined; | 
|  | uchar	isartificial; | 
|  | uchar	isdeclaration; | 
|  | uchar	isexternal; | 
|  | uchar	isoptional; | 
|  | uchar	isprototyped; | 
|  | uchar	isvarparam; | 
|  | ulong	language; | 
|  | DwarfVal	location; | 
|  | ulong	lowerbound; | 
|  | ulong	lowpc; | 
|  | ulong	macroinfo; | 
|  | char*	name; | 
|  | DwarfBlock	namelistitem; | 
|  | ulong	ordering; | 
|  | ulong	priority; | 
|  | char*	producer; | 
|  | ulong	ranges; | 
|  | DwarfVal	returnaddr; | 
|  | DwarfVal	segment; | 
|  | ulong	sibling; | 
|  | ulong	specification; | 
|  | ulong	startscope; | 
|  | DwarfVal	staticlink; | 
|  | ulong	stmtlist; | 
|  | ulong	stridesize; | 
|  | DwarfVal	stringlength; | 
|  | ulong	type; | 
|  | ulong	upperbound; | 
|  | DwarfVal	uselocation; | 
|  | ulong	virtuality; | 
|  | ulong	visibility; | 
|  | DwarfVal	vtableelemloc; | 
|  | }; | 
|  |  | 
|  | enum | 
|  | { | 
|  | RuleUndef, | 
|  | RuleSame, | 
|  | RuleCfaOffset, | 
|  | RuleRegister, | 
|  | RuleRegOff, | 
|  | RuleLocation | 
|  | }; | 
|  | struct DwarfExpr | 
|  | { | 
|  | int type; | 
|  | long offset; | 
|  | ulong reg; | 
|  | DwarfBlock loc; | 
|  | }; | 
|  |  | 
|  | struct DwarfSym | 
|  | { | 
|  | DwarfAttrs attrs; | 
|  |  | 
|  | /* not for consumer use... */ | 
|  | DwarfBuf b; | 
|  | ulong unit; | 
|  | uint uoff; | 
|  | ulong aoff; | 
|  | int depth; | 
|  | int allunits; | 
|  | ulong nextunit; | 
|  | }; | 
|  |  | 
|  |  | 
|  | Dwarf *dwarfopen(Elf *elf); | 
|  | void dwarfclose(Dwarf*); | 
|  | int dwarfaddrtounit(Dwarf*, ulong, ulong*); | 
|  | int dwarflookupfn(Dwarf*, ulong, ulong, DwarfSym*); | 
|  | int dwarflookupname(Dwarf*, char*, DwarfSym*); | 
|  | int dwarflookupnameinunit(Dwarf*, ulong, char*, DwarfSym*); | 
|  | int dwarflookupsubname(Dwarf*, DwarfSym*, char*, DwarfSym*); | 
|  | int dwarflookuptag(Dwarf*, ulong, ulong, DwarfSym*); | 
|  | int dwarfenumunit(Dwarf*, ulong, DwarfSym*); | 
|  | int dwarfseeksym(Dwarf*, ulong, ulong, DwarfSym*); | 
|  | int dwarfenum(Dwarf*, DwarfSym*); | 
|  | int dwarfnextsym(Dwarf*, DwarfSym*); | 
|  | int dwarfnextsymat(Dwarf*, DwarfSym*, int); | 
|  | int dwarfpctoline(Dwarf*, ulong, char**, char**, char**, ulong*, ulong*, ulong*); | 
|  | int dwarfunwind(Dwarf*, ulong, DwarfExpr*, DwarfExpr*, DwarfExpr*, int); | 
|  | ulong dwarfget1(DwarfBuf*); | 
|  | ulong dwarfget2(DwarfBuf*); | 
|  | ulong dwarfget4(DwarfBuf*); | 
|  | uvlong dwarfget8(DwarfBuf*); | 
|  | ulong dwarfget128(DwarfBuf*); | 
|  | long dwarfget128s(DwarfBuf*); | 
|  | ulong dwarfgetaddr(DwarfBuf*); | 
|  | int dwarfgetn(DwarfBuf*, uchar*, int); | 
|  | uchar *dwarfgetnref(DwarfBuf*, ulong); | 
|  | char *dwarfgetstring(DwarfBuf*); | 
|  |  | 
|  |  | 
|  | typedef struct DwarfAbbrev DwarfAbbrev; | 
|  | typedef struct DwarfAttr DwarfAttr; | 
|  |  | 
|  | struct DwarfAttr | 
|  | { | 
|  | ulong name; | 
|  | ulong form; | 
|  | }; | 
|  |  | 
|  | struct DwarfAbbrev | 
|  | { | 
|  | ulong num; | 
|  | ulong tag; | 
|  | uchar haskids; | 
|  | DwarfAttr *attr; | 
|  | int nattr; | 
|  | }; | 
|  |  | 
|  | struct Dwarf | 
|  | { | 
|  | Elf *elf; | 
|  | int fd; | 
|  | char **reg; | 
|  | int nreg; | 
|  | int addrsize; | 
|  | DwarfBlock abbrev; | 
|  | DwarfBlock aranges; | 
|  | DwarfBlock frame; | 
|  | DwarfBlock info; | 
|  | DwarfBlock line; | 
|  | DwarfBlock pubnames; | 
|  | DwarfBlock pubtypes; | 
|  | DwarfBlock ranges; | 
|  | DwarfBlock str; | 
|  |  | 
|  | /* little cache */ | 
|  | struct { | 
|  | DwarfAbbrev *a; | 
|  | int na; | 
|  | ulong off; | 
|  | } acache; | 
|  | }; | 
|  |  | 
|  | DwarfAbbrev *dwarfgetabbrev(Dwarf*, ulong, ulong); | 
|  |  | 
|  | int dwarfgetinfounit(Dwarf*, ulong, DwarfBlock*); | 
|  |  | 
|  | extern int dwarf386nregs; | 
|  | extern char *dwarf386regs[]; | 
|  | extern char *dwarf386fp; | 
|  |  |