handle Block_entity like other node attributes
[libfirm] / ir / be / beemitter.c
1 /*
2  * Copyright (C) 1995-2008 University of Karlsruhe.  All right reserved.
3  *
4  * This file is part of libFirm.
5  *
6  * This file may be distributed and/or modified under the terms of the
7  * GNU General Public License version 2 as published by the Free Software
8  * Foundation and appearing in the file LICENSE.GPL included in the
9  * packaging of this file.
10  *
11  * Licensees holding valid libFirm Professional Edition licenses may use
12  * this file in accordance with the libFirm Commercial License.
13  * Agreement provided with the Software.
14  *
15  * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
16  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE.
18  */
19
20 /**
21  * @file
22  * @brief       Interface for assembler output.
23  * @author      Matthias Braun
24  * @date        12.03.2007
25  */
26 #include "config.h"
27
28 #include "beemitter.h"
29 #include "irnode_t.h"
30 #include "irprintf.h"
31 #include "ident.h"
32 #include "tv.h"
33 #include "dbginfo.h"
34
35 FILE           *emit_file;
36 struct obstack  emit_obst;
37
38 void be_emit_init(FILE *file)
39 {
40         emit_file       = file;
41         obstack_init(&emit_obst);
42 }
43
44 void be_emit_exit(void)
45 {
46         obstack_free(&emit_obst, NULL);
47 }
48
49 void be_emit_ident(ident *id)
50 {
51         size_t      len = get_id_strlen(id);
52         const char *str = get_id_str(id);
53
54         be_emit_string_len(str, len);
55 }
56
57 void be_emit_tarval(ir_tarval *tv)
58 {
59         char buf[64];
60
61         tarval_snprintf(buf, sizeof(buf), tv);
62         be_emit_string(buf);
63 }
64
65 void be_emit_irvprintf(const char *fmt, va_list args)
66 {
67         char buf[256];
68
69         ir_vsnprintf(buf, sizeof(buf), fmt, args);
70         be_emit_string(buf);
71 }
72
73 void be_emit_irprintf(const char *fmt, ...)
74 {
75         va_list ap;
76
77         va_start(ap, fmt);
78         be_emit_irvprintf(fmt, ap);
79         va_end(ap);
80 }
81
82 void be_emit_write_line(void)
83 {
84         size_t  len  = obstack_object_size(&emit_obst);
85         char   *line = (char*)obstack_finish(&emit_obst);
86
87         fwrite(line, 1, len, emit_file);
88         obstack_free(&emit_obst, line);
89 }
90
91 void be_emit_pad_comment(void)
92 {
93         size_t len = obstack_object_size(&emit_obst);
94         if (len > 30)
95                 len = 30;
96         /* 34 spaces */
97         be_emit_string_len("                                  ", 34 - len);
98 }
99
100 void be_emit_finish_line_gas(const ir_node *node)
101 {
102         dbg_info   *dbg;
103         const char *sourcefile;
104         unsigned    lineno;
105
106         if (node == NULL) {
107                 be_emit_char('\n');
108                 be_emit_write_line();
109                 return;
110         }
111
112         be_emit_pad_comment();
113         be_emit_cstring("/* ");
114         be_emit_irprintf("%+F ", node);
115
116         dbg        = get_irn_dbg_info(node);
117         sourcefile = ir_retrieve_dbg_info(dbg, &lineno);
118         if (sourcefile != NULL) {
119                 be_emit_string(sourcefile);
120                 be_emit_irprintf(":%u", lineno);
121         }
122         be_emit_cstring(" */\n");
123         be_emit_write_line();
124 }