X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbeemitter.c;h=f0f24811eee7a7445d165708e8e9cce5c6ed46b2;hb=70481aa342e22f5f285dc863b366a56393d888af;hp=f2547a981312bfae53dbf6464017eebb24226a94;hpb=77539deaf3f100544beb50cbb45ea354bfa63d13;p=libfirm diff --git a/ir/be/beemitter.c b/ir/be/beemitter.c index f2547a981..f0f24811e 100644 --- a/ir/be/beemitter.c +++ b/ir/be/beemitter.c @@ -1,94 +1,125 @@ /* - * 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 + * @version $Id$ */ -#ifdef HAVE_CONFIG_H #include "config.h" -#endif #include "beemitter.h" #include "irprintf.h" +#include "ident.h" +#include "tv.h" +#include "dbginfo.h" -void be_emit_init_env(be_emit_env_t *env, FILE *F) -{ - memset(env, 0, sizeof(env[0])); +FILE *emit_file; +struct obstack emit_obst; +int emit_linelength; - env->F = F; - obstack_init(&env->obst); - env->linelength = 0; +void be_emit_init(FILE *file) +{ + emit_file = file; + emit_linelength = 0; + obstack_init(&emit_obst); } -void be_emit_destroy_env(be_emit_env_t *env) +void be_emit_exit(void) { - obstack_free(&env->obst, NULL); + obstack_free(&emit_obst, NULL); } -void be_emit_ident(be_emit_env_t *env, ident *id) +void be_emit_ident(ident *id) { - size_t len = get_id_strlen(id); + size_t len = get_id_strlen(id); const char *str = get_id_str(id); - be_emit_string_len(env, str, len); + be_emit_string_len(str, len); +} + +void be_emit_tarval(tarval *tv) +{ + char buf[64]; + + tarval_snprintf(buf, sizeof(buf), tv); + be_emit_string(buf); } -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) { char buf[256]; ir_vsnprintf(buf, sizeof(buf), fmt, args); - be_emit_string(env, buf); + be_emit_string(buf); } -void be_emit_irprintf(be_emit_env_t *env, const char *fmt, ...) +void be_emit_irprintf(const char *fmt, ...) { va_list ap; va_start(ap, fmt); - be_emit_irvprintf(env, fmt, ap); + be_emit_irvprintf(fmt, ap); va_end(ap); } -void be_emit_write_line(be_emit_env_t *env) +void be_emit_write_line(void) { - char *finished_line = obstack_finish(&env->obst); + char *finished_line = obstack_finish(&emit_obst); - fwrite(finished_line, env->linelength, 1, env->F); - env->linelength = 0; - obstack_free(&env->obst, finished_line); + fwrite(finished_line, emit_linelength, 1, emit_file); + emit_linelength = 0; + obstack_free(&emit_obst, finished_line); } -void be_emit_pad_comment(be_emit_env_t *env) +void be_emit_pad_comment(void) { - while(env->linelength <= 30) { - be_emit_char(env, ' '); + while(emit_linelength <= 30) { + be_emit_char(' '); } - be_emit_cstring(env, " "); + be_emit_cstring(" "); } -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) { - dbg_info *dbg; + dbg_info *dbg; const char *sourcefile; - unsigned lineno; + unsigned lineno; if(node == NULL) { - be_emit_char(env, '\n'); - be_emit_write_line(env); + be_emit_char('\n'); + be_emit_write_line(); return; } - be_emit_pad_comment(env); - be_emit_cstring(env, "/* "); - be_emit_irprintf(env, "%+F ", node); + be_emit_pad_comment(); + be_emit_cstring("/* "); + be_emit_irprintf("%+F ", node); - dbg = get_irn_dbg_info(node); - sourcefile = be_retrieve_dbg_info(dbg, &lineno); + dbg = get_irn_dbg_info(node); + sourcefile = ir_retrieve_dbg_info(dbg, &lineno); if(sourcefile != NULL) { - be_emit_string(env, sourcefile); - be_emit_irprintf(env, ":%u", lineno); + be_emit_string(sourcefile); + be_emit_irprintf(":%u", lineno); } - be_emit_cstring(env, " */\n"); - be_emit_write_line(env); + be_emit_cstring(" */\n"); + be_emit_write_line(); }