home *** CD-ROM | disk | FTP | other *** search
/ Chip 2004 July / CMCD0704.ISO / Software / Freeware / Utilitare / VisualBoyAdvance-1.7.2 / src / elf.h < prev    next >
Encoding:
C/C++ Source or Header  |  2004-05-13  |  4.8 KB  |  284 lines

  1. // -*- C++ -*-
  2. // VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator.
  3. // Copyright (C) 1999-2003 Forgotten
  4. // Copyright (C) 2004 Forgotten and the VBA development team
  5.  
  6. // This program is free software; you can redistribute it and/or modify
  7. // it under the terms of the GNU General Public License as published by
  8. // the Free Software Foundation; either version 2, or(at your option)
  9. // any later version.
  10. //
  11. // This program is distributed in the hope that it will be useful,
  12. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. // GNU General Public License for more details.
  15. //
  16. // You should have received a copy of the GNU General Public License
  17. // along with this program; if not, write to the Free Software Foundation,
  18. // Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  19.  
  20. #ifndef VBA_ELF_H
  21. #define VBA_ELF_H
  22.  
  23. enum LocationType {
  24.   LOCATION_register,
  25.   LOCATION_memory,
  26.   LOCATION_value
  27. };
  28.  
  29. #define DW_ATE_boolean       0x02
  30. #define DW_ATE_signed        0x05
  31. #define DW_ATE_unsigned      0x07
  32. #define DW_ATE_unsigned_char 0x08
  33.  
  34. struct ELFHeader {
  35.   u32 magic;
  36.   u8 clazz;
  37.   u8 data;
  38.   u8 version;
  39.   u8 pad[9];
  40.   u16 e_type;
  41.   u16 e_machine;
  42.   u32 e_version;
  43.   u32 e_entry;
  44.   u32 e_phoff;
  45.   u32 e_shoff;
  46.   u32 e_flags;
  47.   u16 e_ehsize;
  48.   u16 e_phentsize;
  49.   u16 e_phnum;
  50.   u16 e_shentsize;
  51.   u16 e_shnum;
  52.   u16 e_shstrndx;
  53. };
  54.  
  55. struct ELFProgramHeader {
  56.   u32 type;
  57.   u32 offset;
  58.   u32 vaddr;
  59.   u32 paddr;
  60.   u32 filesz;
  61.   u32 memsz;
  62.   u32 flags;
  63.   u32 align;
  64. };
  65.  
  66. struct ELFSectionHeader {
  67.   u32 name;
  68.   u32 type;
  69.   u32 flags;
  70.   u32 addr;
  71.   u32 offset;
  72.   u32 size;
  73.   u32 link;
  74.   u32 info;
  75.   u32 addralign;
  76.   u32 entsize;
  77. };
  78.  
  79. struct ELFSymbol {
  80.   u32 name;
  81.   u32 value;
  82.   u32 size;
  83.   u8 info;
  84.   u8 other;
  85.   u16 shndx;
  86. };
  87.  
  88. struct ELFBlock {
  89.   int length;
  90.   u8 *data;
  91. };
  92.  
  93. struct ELFAttr {
  94.   u32 name;
  95.   u32 form;
  96.   union {
  97.     u32 value;
  98.     char *string;
  99.     u8 *data;
  100.     bool flag;
  101.     ELFBlock *block;
  102.   };
  103. };
  104.  
  105. struct ELFAbbrev {
  106.   u32 number;
  107.   u32 tag;
  108.   bool hasChildren;
  109.   int numAttrs;
  110.   ELFAttr *attrs;
  111.   ELFAbbrev *next;
  112. };
  113.  
  114. enum TypeEnum {
  115.   TYPE_base,
  116.   TYPE_pointer,
  117.   TYPE_function,
  118.   TYPE_void,
  119.   TYPE_array,
  120.   TYPE_struct,
  121.   TYPE_reference,
  122.   TYPE_enum,
  123.   TYPE_union
  124. };
  125.  
  126. struct Type;
  127. struct Object;
  128.  
  129. struct FunctionType {
  130.   Type *returnType;
  131.   Object *args;
  132. };
  133.  
  134. struct Member {
  135.   char *name;
  136.   Type *type;
  137.   int bitSize;
  138.   int bitOffset;
  139.   int byteSize;
  140.   ELFBlock *location;
  141. };
  142.  
  143. struct Struct {
  144.   int memberCount;
  145.   Member *members;
  146. };
  147.  
  148. struct Array {
  149.   Type *type;
  150.   int maxBounds;
  151.   int *bounds;
  152. };
  153.  
  154. struct EnumMember {
  155.   char *name;
  156.   u32 value;
  157. };
  158.  
  159. struct Enum {
  160.   int count;
  161.   EnumMember *members;
  162. };
  163.  
  164. struct Type {
  165.   u32 offset;
  166.   TypeEnum type;
  167.   char *name;
  168.   int encoding;
  169.   int size;
  170.   int bitSize;
  171.   union {
  172.     Type *pointer;
  173.     FunctionType *function;
  174.     Array *array;
  175.     Struct *structure;
  176.     Enum *enumeration;
  177.   };
  178.   Type *next;
  179. };
  180.  
  181. struct Object {
  182.   char *name;
  183.   int file;
  184.   int line;
  185.   bool external;
  186.   Type *type;
  187.   ELFBlock *location;
  188.   u32 startScope;
  189.   u32 endScope;
  190.   Object *next;
  191. };
  192.  
  193. struct Function {
  194.   char *name;
  195.   u32 lowPC;
  196.   u32 highPC;
  197.   int file;
  198.   int line;
  199.   bool external;
  200.   Type *returnType;
  201.   Object *parameters;
  202.   Object *variables;
  203.   ELFBlock *frameBase;
  204.   Function *next;
  205. };
  206.  
  207. struct LineInfoItem {
  208.   u32 address;
  209.   char *file;  
  210.   int line;
  211. };
  212.  
  213. struct LineInfo {
  214.   int fileCount;
  215.   char **files;
  216.   int number;
  217.   LineInfoItem *lines;
  218. };
  219.  
  220. struct ARange {
  221.   u32 lowPC;
  222.   u32 highPC;
  223. };
  224.  
  225. struct ARanges {
  226.   u32 offset;
  227.   int count;
  228.   ARange *ranges;
  229. };
  230.  
  231. struct CompileUnit {
  232.   u32 length;
  233.   u8 *top;
  234.   u32 offset;
  235.   ELFAbbrev **abbrevs;
  236.   ARanges *ranges;
  237.   char *name;
  238.   char *compdir;  
  239.   u32 lowPC;
  240.   u32 highPC;
  241.   bool hasLineInfo;
  242.   u32 lineInfo;
  243.   LineInfo *lineInfoTable;
  244.   Function *functions;
  245.   Function *lastFunction;
  246.   Object *variables;
  247.   Type *types;
  248.   CompileUnit *next;  
  249. };
  250.  
  251. struct DebugInfo {
  252.   u8 *debugfile;
  253.   u8 *abbrevdata;
  254.   u8 *debugdata;
  255.   u8 *infodata;
  256.   int numRanges;
  257.   ARanges *ranges;
  258. };
  259.  
  260. struct Symbol {
  261.   char *name;
  262.   int type;
  263.   int binding;
  264.   u32 address;
  265.   u32 value;
  266.   u32 size;
  267. };
  268.  
  269. extern u32 elfReadLEB128(u8 *, int *);
  270. extern s32 elfReadSignedLEB128(u8 *, int *);
  271. extern bool elfRead(const char *, int &, FILE *f);
  272. extern bool elfGetSymbolAddress(char *,u32 *, u32 *, int *);
  273. extern char *elfGetAddressSymbol(u32);
  274. extern char *elfGetSymbol(int, u32 *, u32 *, int *);
  275. extern void elfCleanUp();
  276. extern bool elfGetCurrentFunction(u32, Function **, CompileUnit **c);
  277. extern bool elfGetObject(char *, Function *, CompileUnit *, Object **);
  278. extern bool elfFindLineInUnit(u32 *, CompileUnit *, int);
  279. extern bool elfFindLineInModule(u32 *, char *, int);
  280. u32 elfDecodeLocation(Function *, ELFBlock *, LocationType *);
  281. u32 elfDecodeLocation(Function *, ELFBlock *, LocationType *, u32);
  282. int elfFindLine(CompileUnit *unit, Function *func, u32 addr, char **);
  283. #endif
  284.