public CStruct TranslateStruct(IDiaSymbol sym) { IDiaEnumSymbols symbols; sym.findChildren(SymTagEnum.SymTagData, null, 0, out symbols); CStruct res = new CStruct(); Offset lastOffset = Offset.Neg; foreach (IDiaSymbol subSym in symbols) { Offset thisOffset = Offset.FromDiaSymbol(subSym); if (thisOffset.IsLessThanOrEqualTo(lastOffset)) { symbols.Reset(); return(TranslateStruct2(symbols)); } string name = subSym.name; CType type = TranslateMember(subSym); res.Add(type, name, thisOffset); lastOffset = thisOffset; } return(res); }
public static Offset BottomOffsetFromDiaSymbol(IDiaSymbol symbol) { Offset obj = Offset.FromDiaSymbol(symbol); switch ((LocationTypeEnum)symbol.locationType) { case LocationTypeEnum.LocIsThisRel: obj._bytes += (int)symbol.type.length; break; case LocationTypeEnum.LocIsBitField: obj._bits += (int)symbol.length; obj.Normalize(); break; } return(obj); }
public CUnion TranslateUnion(IDiaSymbol sym) { IDiaEnumSymbols symbols; sym.findChildren(SymTagEnum.SymTagData, null, 0, out symbols); CUnion res = new CUnion(); foreach (IDiaSymbol subSym in symbols) { Offset thisOffset = Offset.FromDiaSymbol(subSym); if (!thisOffset.IsEqualTo(Offset.Zero)) { symbols.Reset(); return(TranslateUnion2(symbols)); } string name = subSym.name; CType type = TranslateMember(subSym); res.Add(type, name); } return(res); }