X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbeemitter.c;h=490cc0bbce4bab3f0e56b9ae7471e7cfbab799f0;hb=fef8dc3eff6468d7d65485af8e1ac9884c504e1a;hp=344d4a69344ab58e1ebd354430d90867ec75d6e4;hpb=3740017a70006943d71f737f79dfca87071f7dc9;p=libfirm diff --git a/ir/be/beemitter.c b/ir/be/beemitter.c index 344d4a693..490cc0bbc 100644 --- a/ir/be/beemitter.c +++ b/ir/be/beemitter.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1995-2007 University of Karlsruhe. All right reserved. + * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved. * * This file is part of libFirm. * @@ -22,103 +22,105 @@ * @brief Interface for assembler output. * @author Matthias Braun * @date 12.03.2007 - * @version $Id$ */ -#ifdef HAVE_CONFIG_H #include "config.h" -#endif +#include "bedwarf.h" #include "beemitter.h" +#include "be_t.h" +#include "error.h" +#include "irnode_t.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])); - - env->F = F; - obstack_init(&env->obst); - env->linelength = 0; -} - -void be_emit_destroy_env(be_emit_env_t *env) -{ - obstack_free(&env->obst, NULL); -} +FILE *emit_file; +struct obstack emit_obst; -void be_emit_ident(be_emit_env_t *env, ident *id) +void be_emit_init(FILE *file) { - size_t len = get_id_strlen(id); - const char *str = get_id_str(id); - - be_emit_string_len(env, str, len); + emit_file = file; + obstack_init(&emit_obst); } -void be_emit_tarval(be_emit_env_t *env, tarval *tv) +void be_emit_exit(void) { - char buf[64]; - - tarval_snprintf(buf, sizeof(buf), tv); - be_emit_string(env, buf); + obstack_free(&emit_obst, NULL); } -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); + ir_obst_vprintf(&emit_obst, fmt, args); } -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); + size_t len = obstack_object_size(&emit_obst); + char *line = (char*)obstack_finish(&emit_obst); - fwrite(finished_line, env->linelength, 1, env->F); - env->linelength = 0; - obstack_free(&env->obst, finished_line); + fwrite(line, 1, len, emit_file); + obstack_free(&emit_obst, 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, ' '); - } - be_emit_cstring(env, " "); + size_t len = obstack_object_size(&emit_obst); + if (len > 30) + len = 30; + /* 34 spaces */ + be_emit_string_len(" ", 34 - len); } -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; - const char *sourcefile; - unsigned lineno; + dbg_info *dbg; + src_loc_t loc; - if(node == NULL) { - be_emit_char(env, '\n'); - be_emit_write_line(env); + if (node == NULL || !be_options.verbose_asm) { + 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); - if(sourcefile != NULL) { - be_emit_string(env, sourcefile); - be_emit_irprintf(env, ":%u", lineno); + loc = ir_retrieve_dbg_info(dbg); + if (loc.file) { + be_emit_string(loc.file); + if (loc.line != 0) { + be_emit_irprintf(":%u", loc.line); + if (loc.column != 0) { + be_emit_irprintf(":%u", loc.column); + } + } } - be_emit_cstring(env, " */\n"); - be_emit_write_line(env); + be_emit_cstring(" */\n"); + be_emit_write_line(); +} + +void be_emit_nothing(ir_node const *const node) +{ + (void)node; +} + +void be_emit_node(ir_node const *const node) +{ + be_dwarf_location(get_irn_dbg_info(node)); + ir_op *const op = get_irn_op(node); + emit_func *const emit = get_generic_function_ptr(emit_func, op); + DEBUG_ONLY(if (!emit) panic("no emit handler for node %+F (%+G, graph %+F)\n", node, node, get_irn_irg(node));) + emit(node); }