we don't need no stinking selfs
[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  * @version     $Id$
26  */
27 #ifdef HAVE_CONFIG_H
28 #include "config.h"
29 #endif
30
31 #include "beemitter.h"
32 #include "irprintf.h"
33 #include "ident.h"
34 #include "tv.h"
35 #include "dbginfo.h"
36
37 FILE           *emit_file;
38 struct obstack  emit_obst;
39 int             emit_linelength;
40
41 void be_emit_init(FILE *file)
42 {
43         emit_file       = file;
44         emit_linelength = 0;
45         obstack_init(&emit_obst);
46 }
47
48 void be_emit_exit(void)
49 {
50         obstack_free(&emit_obst, NULL);
51 }
52
53 void be_emit_ident(ident *id)
54 {
55         size_t      len = get_id_strlen(id);
56         const char *str = get_id_str(id);
57
58         be_emit_string_len(str, len);
59 }
60
61 void be_emit_tarval(tarval *tv)
62 {
63         char buf[64];
64
65         tarval_snprintf(buf, sizeof(buf), tv);
66         be_emit_string(buf);
67 }
68
69 void be_emit_irvprintf(const char *fmt, va_list args)
70 {
71         char buf[256];
72
73         ir_vsnprintf(buf, sizeof(buf), fmt, args);
74         be_emit_string(buf);
75 }
76
77 void be_emit_irprintf(const char *fmt, ...)
78 {
79         va_list ap;
80
81         va_start(ap, fmt);
82         be_emit_irvprintf(fmt, ap);
83         va_end(ap);
84 }
85
86 void be_emit_write_line(void)
87 {
88         char *finished_line = obstack_finish(&emit_obst);
89
90         fwrite(finished_line, emit_linelength, 1, emit_file);
91         emit_linelength = 0;
92         obstack_free(&emit_obst, finished_line);
93 }
94
95 void be_emit_pad_comment(void)
96 {
97         while(emit_linelength <= 30) {
98                 be_emit_char(' ');
99         }
100         be_emit_cstring("    ");
101 }
102
103 void be_emit_finish_line_gas(const ir_node *node)
104 {
105         dbg_info   *dbg;
106         const char *sourcefile;
107         unsigned    lineno;
108
109         if(node == NULL) {
110                 be_emit_char('\n');
111                 be_emit_write_line();
112                 return;
113         }
114
115         be_emit_pad_comment();
116         be_emit_cstring("/* ");
117         be_emit_irprintf("%+F ", node);
118
119         dbg        = get_irn_dbg_info(node);
120         sourcefile = ir_retrieve_dbg_info(dbg, &lineno);
121         if(sourcefile != NULL) {
122                 be_emit_string(sourcefile);
123                 be_emit_irprintf(":%u", lineno);
124         }
125         be_emit_cstring(" */\n");
126         be_emit_write_line();
127 }