efa3a8074648cfd8398ecafd622c122a4bfac340
[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_irvprintf(const char *fmt, va_list args)
58 {
59         ir_obst_vprintf(&emit_obst, fmt, args);
60 }
61
62 void be_emit_irprintf(const char *fmt, ...)
63 {
64         va_list ap;
65
66         va_start(ap, fmt);
67         be_emit_irvprintf(fmt, ap);
68         va_end(ap);
69 }
70
71 void be_emit_write_line(void)
72 {
73         size_t  len  = obstack_object_size(&emit_obst);
74         char   *line = (char*)obstack_finish(&emit_obst);
75
76         fwrite(line, 1, len, emit_file);
77         obstack_free(&emit_obst, line);
78 }
79
80 void be_emit_pad_comment(void)
81 {
82         size_t len = obstack_object_size(&emit_obst);
83         if (len > 30)
84                 len = 30;
85         /* 34 spaces */
86         be_emit_string_len("                                  ", 34 - len);
87 }
88
89 void be_emit_finish_line_gas(const ir_node *node)
90 {
91         dbg_info   *dbg;
92         src_loc_t   loc;
93
94         if (node == NULL) {
95                 be_emit_char('\n');
96                 be_emit_write_line();
97                 return;
98         }
99
100         be_emit_pad_comment();
101         be_emit_cstring("/* ");
102         be_emit_irprintf("%+F ", node);
103
104         dbg = get_irn_dbg_info(node);
105         loc = ir_retrieve_dbg_info(dbg);
106         if (loc.file) {
107                 be_emit_string(loc.file);
108                 if (loc.line != 0) {
109                         be_emit_irprintf(":%u", loc.line);
110                         if (loc.column != 0) {
111                                 be_emit_irprintf(":%u", loc.column);
112                         }
113                 }
114         }
115         be_emit_cstring(" */\n");
116         be_emit_write_line();
117 }