f2547a981312bfae53dbf6464017eebb24226a94
[libfirm] / ir / be / beemitter.c
1 /*
2  * Author:      Matthias Braun
3  * Date:                12.03.2007
4  * Copyright:   (c) Universitaet Karlsruhe
5  * License:     This file is protected by GPL -  GNU GENERAL PUBLIC LICENSE.
6  */
7 #ifdef HAVE_CONFIG_H
8 #include "config.h"
9 #endif
10
11 #include "beemitter.h"
12 #include "irprintf.h"
13
14 void be_emit_init_env(be_emit_env_t *env, FILE *F)
15 {
16         memset(env, 0, sizeof(env[0]));
17
18         env->F = F;
19         obstack_init(&env->obst);
20         env->linelength = 0;
21 }
22
23 void be_emit_destroy_env(be_emit_env_t *env)
24 {
25         obstack_free(&env->obst, NULL);
26 }
27
28 void be_emit_ident(be_emit_env_t *env, ident *id)
29 {
30         size_t len = get_id_strlen(id);
31         const char *str = get_id_str(id);
32
33         be_emit_string_len(env, str, len);
34 }
35
36 void be_emit_irvprintf(be_emit_env_t *env, const char *fmt, va_list args)
37 {
38         char buf[256];
39
40         ir_vsnprintf(buf, sizeof(buf), fmt, args);
41         be_emit_string(env, buf);
42 }
43
44 void be_emit_irprintf(be_emit_env_t *env, const char *fmt, ...)
45 {
46         va_list ap;
47
48         va_start(ap, fmt);
49         be_emit_irvprintf(env, fmt, ap);
50         va_end(ap);
51 }
52
53 void be_emit_write_line(be_emit_env_t *env)
54 {
55         char *finished_line = obstack_finish(&env->obst);
56
57         fwrite(finished_line, env->linelength, 1, env->F);
58         env->linelength = 0;
59         obstack_free(&env->obst, finished_line);
60 }
61
62 void be_emit_pad_comment(be_emit_env_t *env)
63 {
64         while(env->linelength <= 30) {
65                 be_emit_char(env, ' ');
66         }
67         be_emit_cstring(env, "    ");
68 }
69
70 void be_emit_finish_line_gas(be_emit_env_t *env, const ir_node *node)
71 {
72         dbg_info *dbg;
73         const char *sourcefile;
74         unsigned lineno;
75
76         if(node == NULL) {
77                 be_emit_char(env, '\n');
78                 be_emit_write_line(env);
79                 return;
80         }
81
82         be_emit_pad_comment(env);
83         be_emit_cstring(env, "/* ");
84         be_emit_irprintf(env, "%+F ", node);
85
86         dbg = get_irn_dbg_info(node);
87         sourcefile = be_retrieve_dbg_info(dbg, &lineno);
88         if(sourcefile != NULL) {
89                 be_emit_string(env, sourcefile);
90                 be_emit_irprintf(env, ":%u", lineno);
91         }
92         be_emit_cstring(env, " */\n");
93         be_emit_write_line(env);
94 }