/* This file is obj-generic.h
   Copyright 1987, 1988, 1989, 1990, 1991, 1992, 1993, 2000
   Free Software Foundation, Inc.

   This file is part of GAS, the GNU Assembler.

   GAS 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 2, or (at your option)
   any later version.

   GAS 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 GAS; see the file COPYING.  If not, write to the Free
   Software Foundation, 59 Temple Place - Suite 330, Boston, MA
   02111-1307, USA.  */

/*
 * This file is obj-generic.h and is intended to be a template for
 * object format specific header files.
 */

/* define an obj specific macro off which target cpu back ends may key.  */
#define OBJ_GENERIC 1

/* include whatever target cpu is appropriate.  */
#include "targ-cpu.h"

/*
 * SYMBOLS
 */

/*
 * If your object format needs to reorder symbols, define this.  When
 * defined, symbols are kept on a doubly linked list and functions are
 * made available for push, insert, append, and delete.  If not defined,
 * symbols are kept on a singly linked list, only the append and clear
 * facilities are available, and they are macros.
 */

/* #define SYMBOLS_NEED_PACKPOINTERS */

/*  */
typedef struct
  {
    void *nothing;
  }

obj_symbol_type;		/* should be the format's symbol structure */

typedef void *object_headers;

/* symbols have names */
#define S_GET_NAME(s)		("foo")	/* get the name of a symbolP */
#define S_SET_NAME(s,v)		;
/* symbols have segments */
#define S_GET_SEGMENT(s)	(SEG_UNKNOWN)
#define S_SET_SEGMENT(s,v)	;
/* symbols may be external */
#define S_IS_EXTERNAL(s)	(0)
#define S_SET_EXTERNAL(s)	;

/* symbols may or may not be defined */
#define S_IS_DEFINED(s)		(0)

#define DEFAULT_MAGIC_NUMBER_FOR_OBJECT_FILE (0)	/* your magic number */

#define OBJ_EMIT_LINENO(a,b,c)	/* must be *something*.  This no-op's it out.  */

/*
 * Local Variables:
 * comment-column: 0
 * fill-column: 131
 * End:
 */
