ad89a969a3b6befc1b54b9ab53e1bf93fd1a677f
[cparser] / firm_codegen.c
1 /**
2  * @file firm_codegen.c
3  *
4  * Compile when BACK_END_IS_CP_FIRM_BE is defined
5  *
6  * (C) 2005-2009  Michael Beck  beck@ipd.info.uni-karlsruhe.de
7  *
8  * $Id$
9  */
10 #include <string.h>
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <libfirm/dbginfo.h>
14 #include <libfirm/adt/xmalloc.h>
15 #include <libfirm/be.h>
16
17 #ifdef FIRM2C_BACKEND
18 #include "cbackend.h"
19 #endif
20
21 #include "firm_codegen.h"
22 #include "firm_cmdline.h"
23 #include "firm_opt.h"
24 #include "firm_timing.h"
25
26 /**
27  * Substitutes '.c' for '.s'.
28  */
29 static char *generate_asm_file_name(const char *file_name) {
30   int len             = strlen(file_name);
31   char *asm_file_name = xmalloc(len + 5);   /* .asm + \0 */
32
33   strcpy(asm_file_name, file_name);
34   if (asm_file_name[len - 2] == '.' && asm_file_name[len - 1] == 'c')
35     asm_file_name[len - 2] = '\0';
36
37   switch (firm_be_opt.selection) {
38 #ifdef FIRM2C_BACKEND
39   case BE_FIRM2C:
40     strncat(asm_file_name, ".s.c", 4);
41     break;
42 #endif
43
44   case BE_FIRM_BE:
45     strncat(asm_file_name, ".s", 4);
46     break;
47   }
48
49   return asm_file_name;
50 }  /* generate_asm_file_name */
51
52 /**
53  * Calls the specified backend.
54  * Code is written to file <file_name> ('.c' is substituted for '.asm')
55  */
56 void do_codegen(FILE *out, const char *file_name)
57 {
58         FILE *close_out = NULL;
59         if (out == NULL) {
60                 char *asm_file_name = generate_asm_file_name(file_name);
61
62                 if ((out = fopen(asm_file_name, "w")) == NULL) {
63                         fprintf(stderr, "Could not open output file %s\n", asm_file_name);
64                         exit(1);
65                 }
66                 free(asm_file_name);
67                 close_out = out;
68         }
69
70         switch (firm_be_opt.selection) {
71 #ifdef FIRM2C_BACKEND
72                 case BE_FIRM2C: {
73                         ir_timer_t *timer = ir_timer_new();
74                         timer_register(timer, "Firm: C-generating backend");
75                         timer_start(timer);
76                         generate_code_file(out);
77                         timer_stop(timer);
78                         break;
79                 }
80 #endif
81
82                 case BE_FIRM_BE: {
83                         ir_timer_t *timer = ir_timer_new();
84                         timer_register(timer, "Firm: backend");
85                         timer_start(timer);
86                         be_main(out, file_name);
87                         timer_stop(timer);
88                         break;
89                 }
90
91                 default:
92                         fprintf(stderr, "Fatal: Unknown backend %d\n", firm_be_opt.selection);
93         } /* switch (firm_be_opt.selection) */
94
95         if (close_out)
96                 fclose(close_out);
97 }