X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbeemitter.h;h=d44dfd39736b85ce289fa1ce4e685b07741c7e74;hb=59e2d36967edfaaa770afdf3d498bed3b39e55ee;hp=331c2202d580242408261e023143cb1d408db25c;hpb=542f9123b12bea3c1789184993576c5b55c0f503;p=libfirm diff --git a/ir/be/beemitter.h b/ir/be/beemitter.h index 331c2202d..d44dfd397 100644 --- a/ir/be/beemitter.h +++ b/ir/be/beemitter.h @@ -1,132 +1,141 @@ /* - * Author: Matthias Braun - * Date: 12.03.2007 - * Copyright: (c) Universitaet Karlsruhe - * License: This file is protected by GPL - GNU GENERAL PUBLIC LICENSE. + * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved. + * + * This file is part of libFirm. + * + * This file may be distributed and/or modified under the terms of the + * GNU General Public License version 2 as published by the Free Software + * Foundation and appearing in the file LICENSE.GPL included in the + * packaging of this file. + * + * Licensees holding valid libFirm Professional Edition licenses may use + * this file in accordance with the libFirm Commercial License. + * Agreement provided with the Software. + * + * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE + * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE. + */ + +/** + * @file + * @brief Interface for assembler output. + * @author Matthias Braun + * @date 12.03.2007 + * + * This is a framework for emitting data (usually the final assembly code) */ #ifndef FIRM_BE_BEEMITTER_H #define FIRM_BE_BEEMITTER_H #include #include +#include "firm_types.h" #include "obst.h" -#include "ident.h" -#include "irnode.h" #include "be.h" +#include "irop_t.h" -/* framework for emitting data (usually the final assembly code) */ - -/** The emitter environment. */ -typedef struct be_emit_env_t { - FILE *F; /**< The handle of the (assembler) file that is written to. */ - struct obstack obst; /**< An obstack for temporary storage. */ - int linelength; /**< The length of the current line. */ -} be_emit_env_t; +/* don't use the following vars directly, they're only here for the inlines */ +extern FILE *emit_file; +extern struct obstack emit_obst; /** * Emit a character to the (assembler) output. - * - * @param env the emitter environment */ -static INLINE void be_emit_char(be_emit_env_t *env, char c) { - obstack_1grow(&env->obst, c); - env->linelength++; +static inline void be_emit_char(char c) +{ + obstack_1grow(&emit_obst, c); } /** * Emit a string to the (assembler) output. * - * @param env the emitter environment * @param str the string * @param l the length of the given string */ -static INLINE void be_emit_string_len(be_emit_env_t *env, const char *str, - size_t l) +static inline void be_emit_string_len(const char *str, size_t l) { - obstack_grow(&env->obst, str, l); - env->linelength += l; + obstack_grow(&emit_obst, str, l); } /** * Emit a null-terminated string to the (assembler) output. * - * @param env the emitter environment * @param str the null-terminated string */ -static INLINE void be_emit_string(be_emit_env_t *env, const char *str) +static inline void be_emit_string(const char *str) { size_t len = strlen(str); - be_emit_string_len(env, str, len); + be_emit_string_len(str, len); } /** * Emit a C string-constant to the (assembler) output. * - * @param env the emitter environment * @param str the null-terminated string constant */ -#define be_emit_cstring(env, str) { be_emit_string_len(env, str, sizeof(str)-1); } +#define be_emit_cstring(str) \ + be_emit_string_len(str, sizeof(str) - 1) /** * Initializes an emitter environment. * - * @param env the (uninitialized) emitter environment * @param F a file handle where the emitted file is written to. */ -void be_emit_init_env(be_emit_env_t *env, FILE *F); +void be_emit_init(FILE *F); /** * Destroys the given emitter environment. - * - * @param env the emitter environment - */ -void be_emit_destroy_env(be_emit_env_t *env); - -/** - * Emit an ident to the (assembler) output. - * - * @param env the emitter environment - * @param id the ident to be emitted */ -void be_emit_ident(be_emit_env_t *env, ident *id); +void be_emit_exit(void); /** * Emit the output of an ir_printf. * - * @param env the emitter environment * @param fmt the ir_printf format */ -void be_emit_irprintf(be_emit_env_t *env, const char *fmt, ...); +void be_emit_irprintf(const char *fmt, ...); /** * Emit the output of an ir_vprintf. * - * @param env the emitter environment * @param fmt the ir_printf format */ -void be_emit_irvprintf(be_emit_env_t *env, const char *fmt, va_list args); +void be_emit_irvprintf(const char *fmt, va_list args); /** * Flush the line in the current line buffer to the emitter file. - * - * @param env the emitter environment */ -void be_emit_write_line(be_emit_env_t *env); +void be_emit_write_line(void); /** * Flush the line in the current line buffer to the emitter file and * appends a gas-style comment with the node number and writes the line * - * @param env the emitter environment * @param node the node to get the debug info from */ -void be_emit_finish_line_gas(be_emit_env_t *env, const ir_node *node); +void be_emit_finish_line_gas(const ir_node *node); /** * Emit spaces until the comment position is reached. - * - * @param env the emitter environment */ -void be_emit_pad_comment(be_emit_env_t *env); +void be_emit_pad_comment(void); + +/** + * The type of a emitter function. + */ +typedef void emit_func(ir_node const *node); + +static inline void be_set_emitter(ir_op *const op, emit_func *const func) +{ + set_generic_function_ptr(op, func); +} + +void be_emit_nothing(ir_node const *node); + +/** + * Emit code for a node. + */ +void be_emit_node(ir_node const *node); -#endif /* FIRM_BE_BEEMITTER_H */ +#endif