asm.h   [plain text]


/* APPLE LOCAL file CW asm blocks */
#ifndef CONFIG_ASM_H
#define CONFIG_ASM_H

#include "cpplib.h"

/* We use a small state machine to inform the lexer when to start
   returning tokens marking the beginning of each asm line.  */
enum iasm_states {
  /* Normal code.  */
  iasm_none,
  /* '{' of asm block seen, decls may appear.  */
  iasm_decls,
  /* No more decls, in asm block proper, '}' not seen yet.  */
  iasm_asm
};

/* Nonzero means that CodeWarrior-style inline assembler is to be parsed.  */

extern int flag_iasm_blocks;

extern enum iasm_states iasm_state;
extern bool iasm_in_decl;
extern bool inside_iasm_block;
extern bool iasm_kill_regs;
extern bool iasm_in_operands;
extern tree iasm_do_id (tree);
/* Maximum number of arguments.  */
#define IASM_MAX_ARG 11

#ifndef TARGET_IASM_EXTRA_INFO
#define TARGET_IASM_EXTRA_INFO
#endif

struct iasm_md_Extra_info {
  /* Number of operands to the ASM_expr.  Note, this can be different
     from the number of operands to the instruction, in cases like:

        mov 0(foo,bar,4), $42

	where foo and bar are C expressions.  */
  int num;

  struct {
    /* Constraints for operand to the ASM_EXPR.  */
    const char *constraint;
    tree var;
    unsigned int argnum;
    bool must_be_reg;
    bool was_output;
  } dat[IASM_MAX_ARG];

  int num_rewrites;
  struct {
    int dat_index;
    char *arg_p;
  } rewrite[IASM_MAX_ARG];

  bool no_label_map;
  const char *modifier;

  TARGET_IASM_EXTRA_INFO
};
typedef struct iasm_md_Extra_info iasm_md_extra_info;

void iasm_print_operand (char *buf, tree arg, unsigned argnum, tree *uses,
			 bool must_be_reg, bool must_not_be_reg, iasm_md_extra_info *e);

extern void iasm_stmt (tree, tree, int);
extern tree iasm_build_register_offset (tree, tree);
extern tree iasm_label (tree, bool);
extern tree prepend_char_identifier (tree, char);
extern tree iasm_reg_name (tree);
extern void iasm_entry (int, tree);
extern int iasm_typename_or_reserved (tree);
extern tree iasm_c_build_component_ref (tree, tree);
extern tree iasm_get_identifier (tree, const char *);
extern tree iasm_build_bracket (tree, tree);
extern bool iasm_is_prefix (tree);
extern void iasm_skip_to_eol (void);
extern bool iasm_memory_clobber (const char *);
extern void iasm_force_constraint (const char *c, iasm_md_extra_info *e);
extern tree iasm_ptr_conv (tree type, tree exp);
extern void iasm_get_register_var (tree var, const char *modifier, char *buf,
				   unsigned argnum, bool must_be_reg, iasm_md_extra_info *e);
extern bool iasm_is_pseudo (const char *);
extern tree iasm_addr (tree);
extern void iasm_end_block (void);
#endif