ia32: Clean up ia32_get_op_estimated_cost().
[libfirm] / ir / be / beemitter.c
1 /*
2  * This file is part of libFirm.
3  * Copyright (C) 2012 University of Karlsruhe.
4  */
5
6 /**
7  * @file
8  * @brief       Interface for assembler output.
9  * @author      Matthias Braun
10  * @date        12.03.2007
11  */
12 #include "config.h"
13
14 #include "bedwarf.h"
15 #include "beemitter.h"
16 #include "be_t.h"
17 #include "error.h"
18 #include "irnode_t.h"
19 #include "irprintf.h"
20 #include "ident.h"
21 #include "tv.h"
22 #include "dbginfo.h"
23
24 FILE           *emit_file;
25 struct obstack  emit_obst;
26
27 void be_emit_init(FILE *file)
28 {
29         emit_file       = file;
30         obstack_init(&emit_obst);
31 }
32
33 void be_emit_exit(void)
34 {
35         obstack_free(&emit_obst, NULL);
36 }
37
38 void be_emit_irvprintf(const char *fmt, va_list args)
39 {
40         ir_obst_vprintf(&emit_obst, fmt, args);
41 }
42
43 void be_emit_irprintf(const char *fmt, ...)
44 {
45         va_list ap;
46
47         va_start(ap, fmt);
48         be_emit_irvprintf(fmt, ap);
49         va_end(ap);
50 }
51
52 void be_emit_write_line(void)
53 {
54         size_t  len  = obstack_object_size(&emit_obst);
55         char   *line = (char*)obstack_finish(&emit_obst);
56
57         fwrite(line, 1, len, emit_file);
58         obstack_free(&emit_obst, line);
59 }
60
61 void be_emit_pad_comment(void)
62 {
63         size_t len = obstack_object_size(&emit_obst);
64         if (len > 30)
65                 len = 30;
66         /* 34 spaces */
67         be_emit_string_len("                                  ", 34 - len);
68 }
69
70 void be_emit_finish_line_gas(const ir_node *node)
71 {
72         dbg_info  *dbg;
73         src_loc_t  loc;
74
75         if (node == NULL || !be_options.verbose_asm) {
76                 be_emit_char('\n');
77                 be_emit_write_line();
78                 return;
79         }
80
81         be_emit_pad_comment();
82         be_emit_cstring("/* ");
83         be_emit_irprintf("%+F ", node);
84
85         dbg = get_irn_dbg_info(node);
86         loc = ir_retrieve_dbg_info(dbg);
87         if (loc.file) {
88                 be_emit_string(loc.file);
89                 if (loc.line != 0) {
90                         be_emit_irprintf(":%u", loc.line);
91                         if (loc.column != 0) {
92                                 be_emit_irprintf(":%u", loc.column);
93                         }
94                 }
95         }
96         be_emit_cstring(" */\n");
97         be_emit_write_line();
98 }
99
100 void be_emit_nothing(ir_node const *const node)
101 {
102         (void)node;
103 }
104
105 void be_emit_node(ir_node const *const node)
106 {
107         be_dwarf_location(get_irn_dbg_info(node));
108         ir_op     *const op   = get_irn_op(node);
109         emit_func *const emit = get_generic_function_ptr(emit_func, op);
110         DEBUG_ONLY(if (!emit) panic("no emit handler for node %+F (%+G, graph %+F)\n", node, node, get_irn_irg(node));)
111         emit(node);
112 }