#define ATT
#define RT
#ifndef AIX
#define AIX
#endif
#include "att.h"
#define HAVE_AOUT <a.out.h>


#define ADDITIONAL_FEATURES \
		     ADD_FEATURE("IBMRT"); \
               ADD_FEATURE("AIX");\
               ADD_FEATURE("BUGGY-CC"); \
      	     ADD_FEATURE("RT")

#define USE_C_EXTENDED_DIV
#define USE_C_EXTENDED_MUL

#define	IBMRT
#define	IEEEFLOAT

#undef SET_REAL_MAXPAGE
#define SET_REAL_MAXPAGE \
	real_maxpage= ulimit(3)/PAGESIZE; \
	if (real_maxpage > MAXPAGE) \
		real_maxpage = MAXPAGE;

#define N_DATADDR(header) 
#define DATA_BEGIN (char *)header.a_dbase

  
#undef  MEM_SAVE_LOCALS

#define MEM_SAVE_LOCALS	\
  struct exec header;\
  int stsize

#undef READ_HEADER
#define READ_HEADER 	fread(&header, sizeof(header), 1, original); \
	data_begin=DATA_BEGIN; \
	data_end = core_end; \
	original_data = header.a_data; \
	header.a_data = data_end - data_begin; \
	header.a_bss = 0; \
        if (header.a_flags & A_HDREXT) printf("extended header"); \
  	fwrite(&header, sizeof(header), 1, save);

/* I don't know why all the bsd versions are subtracting this off
   I thought the header.a_text was the actual size of the text
   not including the header */

#undef FILECPY_HEADER 
#define FILECPY_HEADER \
	filecpy(save, original, header.a_text - sizeof(header));

#undef COPY_TO_SAVE
#define  COPY_TO_SAVE \
  filecpy(save, original, header.a_syms+header.a_trsize+header.a_drsize +header.a_lnums); \
  fread(&stsize, sizeof(stsize), 1, original); \
  fwrite(&stsize, sizeof(stsize), 1, save); \
filecpy(save, original, stsize - sizeof(stsize))


#define LD_COMMAND(command,main,start,input,ldarg,output) \
  sprintf(command, "ld -d -x -A %s -T %x %s %s -o %s", \
            main,start,input,ldarg,output)
/* smallest address data can occur */
#define DBEGIN  0x20000000
  
#define SYM_EXTERNAL_P(sym) (((sym)->n_sclass & (~N_SECT)) == C_EXT)
#define SYM_UNDEF_P(sym) (((sym)->n_sclass & N_SECT) ==  N_UNDF)
#define NUM_AUX(sym) ((sym)->n_numaux) 
#define SYM_NAME(p) SYM_NAME1((struct syment *)(p)) 
#define SYM_NAME1(p) \
  (((p)->_n._n_n._n_zeroes == 0) ? \
	    &my_string_table[(p)->_n._n_n._n_offset] : \
               ((p)->_n._n_name[SYMNMLEN -1] ? \
				 (strncpy(tem,(p)->_n._n_name,  \
					   SYMNMLEN), \
				  (char *)tem) : \
				  (p)->_n._n_name ))

              /* the section like N_ABS,N_TEXT,.. */
#define N_SECTION(sym) (((struct syment *)sym)->n_sclass & N_SECT )
#define N_TYPE N_SECT  

/* the header is regared as part of the text */
#define N_RELOFF(header) A_TRELPOS(header)
#define N_SYMOFF(header) A_SYMPOS(header)
#define N_TXTOFF(header) A_TEXTPOS(header)
#define SYMNMLEN 8
  
#define EXT_and_TEXT_BSS_DAT(p) \
   ((SYM_EXTERNAL_P(p)) && ((N_SECTION(p) == N_TEXT) || \
			(N_SECTION(p) == N_DATA) || \
			(N_SECTION(p) == N_BSS)))

#define N_BADMAG(x) BADMAG(x)
  /* the beginning of the string table: first long will be size of string
     table */
#define N_STROFF(x) A_NAMEPOS(x)

#define MUST_SEEK_TO_STROFF

  /* in aix we must use the pointer to the constant pool for the init_code,
     not the actual pointer to the code.  */

/*   this is no longer valid 
#define VERIFY_INIT \
  if (at==0 || *(char **)at!= memory->cfd.cfd_start) \
    FEerror("init code constant pool bad"); 
*/
  /* find the first symbol in the data section:
     It should begin with with "_init_" and correspond to the
     beginning of the pcp pool for the init function..*/
#define FIND_INIT \
{ if (*ptr==0 && (N_SECTION(sym) == N_DATA) && sym->n_value ) \
  { char tem [9]; \
    char *str=SYM_NAME(sym); \
     dprintf(find init: %s ,str); \
  if (str[1]=='i'    && str[2]=='n'  && str[3]=='i' && str[4]== 't' \
      && str[5]=='_' && str[0]== '_' &&  str[strlen(str)-1] !='X')  \
	*ptr=  sym->n_value ; \
   else {/* printf("The first data symbol was not the init");*/}  \
 }}
  
#define RELOC_FILE "rel_aix.c"

#define GETCWD
  /* the system defines a different getwd */
#define getwd ourgetwd
  
/* these two symbols are too long for the rt pl8cc compiler */
  
#define check_type_or_pathname_string_symbol_stream  check_type_or_path_or_strm
#define check_type_or_Pathname_string_symbol check_type_or_path_sym
#define TSor_pathname_string_symbol_stream  TSor_path_string_sym_strm  
#define check_type_or_symbol_string_package check_type_or_sym_str_pack  


/* If free is likely to be called multiple times on the same block
   (in contravention of ANSI C) by system functions, don't break on
   such an error */

#define NOFREE_ERR

/* Begin for cmpinclude */


/* End for cmpinclude */
