blob: ea3903cfbc401d9dcd143c6ab3a830937cf05ec7 [file] [log] [blame]
/* coffgrok.h
Copyright (C) 2001-2016 Free Software Foundation, Inc.
This file is part of GNU Binutils.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
MA 02110-1301, USA. */
#define T_NULL 0
#define T_VOID 1 /* Function argument (only used by compiler). */
#define T_CHAR 2 /* Character */
#define T_SHORT 3 /* Short integer */
#define T_INT 4 /* Integer */
#define T_LONG 5 /* Long integer */
#define T_FLOAT 6 /* Floating point */
#define T_DOUBLE 7 /* Double word */
#define T_STRUCT 8 /* Structure */
#define T_UNION 9 /* Union */
#define T_ENUM 10 /* Enumeration */
#define T_MOE 11 /* Member of enumeration*/
#define T_UCHAR 12 /* Unsigned character */
#define T_USHORT 13 /* Unsigned short */
#define T_UINT 14 /* Unsigned integer */
#define T_ULONG 15 /* Unsigned long */
#define T_LNGDBL 16 /* Long double */
struct coff_reloc
{
int offset;
struct coff_symbol *symbol;
int addend;
};
struct coff_section
{
char *name;
int code;
int data;
int address;
int number; /* 0..n, .text = 0 */
unsigned int nrelocs;
int size;
struct coff_reloc *relocs;
struct bfd_section *bfd_section;
};
struct coff_ofile
{
int nsources;
struct coff_sfile *source_head;
struct coff_sfile *source_tail;
int nsections;
struct coff_section *sections;
struct coff_symbol *symbol_list_head;
struct coff_symbol *symbol_list_tail;
};
struct coff_isection
{
int low;
int high;
int init;
struct coff_section *parent;
};
struct coff_sfile
{
char *name;
struct coff_scope *scope;
struct coff_sfile *next;
/* Vector which maps where in each output section
the input file has it's data. */
struct coff_isection *section;
};
struct coff_type
{
int size;
enum
{
coff_pointer_type, coff_function_type, coff_array_type, coff_structdef_type, coff_basic_type,
coff_structref_type, coff_enumref_type, coff_enumdef_type, coff_secdef_type
} type;
union
{
struct
{
int address;
int size;
} asecdef;
struct
{
int isstruct;
struct coff_scope *elements;
int idx;
} astructdef;
struct
{
struct coff_symbol *ref;
} astructref;
struct
{
struct coff_scope *elements;
int idx;
} aenumdef;
struct
{
struct coff_symbol *ref;
} aenumref;
struct
{
struct coff_type *points_to;
} pointer;
struct
{
int dim;
struct coff_type *array_of;
} array;
struct
{
struct coff_type * function_returns;
struct coff_scope * parameters;
struct coff_scope * code;
struct coff_line * lines;
} function;
int basic; /* One of T_VOID.. T_UINT */
} u;
};
struct coff_line
{
int nlines;
int * lines;
int * addresses;
};
struct coff_scope
{
struct coff_section * sec; /* Which section. */
int offset; /* Where. */
int size; /* How big. */
struct coff_scope * parent; /* One up. */
struct coff_scope * next; /* Next along. */
int nvars;
struct coff_symbol * vars_head; /* Symbols. */
struct coff_symbol * vars_tail;
struct coff_scope * list_head; /* Children. */
struct coff_scope * list_tail;
};
struct coff_visible
{
enum coff_vis_type
{
coff_vis_ext_def,
coff_vis_ext_ref,
coff_vis_int_def,
coff_vis_common,
coff_vis_auto,
coff_vis_register,
coff_vis_tag,
coff_vis_member_of_struct,
coff_vis_member_of_enum,
coff_vis_autoparam,
coff_vis_regparam,
} type;
};
struct coff_where
{
enum
{
coff_where_stack, coff_where_memory, coff_where_register, coff_where_unknown,
coff_where_strtag, coff_where_member_of_struct,
coff_where_member_of_enum, coff_where_entag, coff_where_typedef
} where;
int offset;
int bitoffset;
int bitsize;
struct coff_section *section;
};
struct coff_symbol
{
char * name;
int tag;
struct coff_type * type;
struct coff_where * where;
struct coff_visible * visible;
struct coff_symbol * next;
struct coff_symbol * next_in_ofile_list; /* For the ofile list. */
int number;
int er_number;
struct coff_sfile * sfile;
};
struct coff_ofile * coff_grok (bfd *);