]> git.xonotic.org Git - xonotic/gmqcc.git/commitdiff
Merge branch 'master' of github.com:graphitemaster/gmqcc
authorDale Weiler <killfieldengine@gmail.com>
Thu, 22 Nov 2012 18:13:12 +0000 (18:13 +0000)
committerDale Weiler <killfieldengine@gmail.com>
Thu, 22 Nov 2012 18:13:12 +0000 (18:13 +0000)
ast.c
gmqcc.h
ir.c
main.c
parser.c

diff --git a/ast.c b/ast.c
index 7d7443f882300c2eb5eecea99190f017fdaf5461..907a944d02f747bd8c00439be2ee1a654b9c6757 100644 (file)
--- a/ast.c
+++ b/ast.c
@@ -940,7 +940,7 @@ const char* ast_function_label(ast_function *self, const char *prefix)
     size_t len;
     char  *from;
 
-    if (!opts_dump)
+    if (!opts_dump && !opts_dumpfin)
         return NULL;
 
     id  = (self->labelcount++);
diff --git a/gmqcc.h b/gmqcc.h
index 7bd1a9f49f1578b6dfde8005d2d303b2311b8116..b252d86dee7d1fe0df528b69e35a2470d92fb9e9 100644 (file)
--- a/gmqcc.h
+++ b/gmqcc.h
@@ -830,6 +830,7 @@ extern const char *opts_output; /* -o file */
 extern int         opts_standard;
 extern bool        opts_debug;
 extern bool        opts_memchk;
+extern bool        opts_dumpfin;
 extern bool        opts_dump;
 extern bool        opts_werror;
 extern bool        opts_forcecrc;
diff --git a/ir.c b/ir.c
index 91e8d7f5ca54f6bba11650eb152f4e71af9f62cc..e0eee379b032c9f77f51e114f2ba8326c44f5c93 100644 (file)
--- a/ir.c
+++ b/ir.c
@@ -542,7 +542,6 @@ bool ir_function_finalize(ir_function *self)
 
     if (!ir_function_calculate_liferanges(self))
         return false;
-
     if (!ir_function_allocate_locals(self))
         return false;
     return true;
@@ -3330,6 +3329,26 @@ void ir_instr_dump(ir_instr *in, char *ind,
     ind[strlen(ind)-1] = 0;
 }
 
+void ir_value_dump_string(const char *str, int (*oprintf)(const char*, ...))
+{
+    oprintf("\"");
+    for (; *str; ++str) {
+        switch (*str) {
+            case '\n': oprintf("\\n"); break;
+            case '\r': oprintf("\\r"); break;
+            case '\t': oprintf("\\t"); break;
+            case '\v': oprintf("\\v"); break;
+            case '\f': oprintf("\\f"); break;
+            case '\b': oprintf("\\b"); break;
+            case '\a': oprintf("\\a"); break;
+            case '\\': oprintf("\\\\"); break;
+            case '"': oprintf("\\\""); break;
+            default: oprintf("%c", *str); break;
+        }
+    }
+    oprintf("\"");
+}
+
 void ir_value_dump(ir_value* v, int (*oprintf)(const char*, ...))
 {
     if (v->isconst) {
@@ -3354,7 +3373,7 @@ void ir_value_dump(ir_value* v, int (*oprintf)(const char*, ...))
                 oprintf("(entity)");
                 break;
             case TYPE_STRING:
-                oprintf("\"%s\"", v->constval.vstring);
+                ir_value_dump_string(v->constval.vstring, oprintf);
                 break;
 #if 0
             case TYPE_INTEGER:
diff --git a/main.c b/main.c
index fd34c928fd861b8f13023057cacedf6e2a41d23f..2078079ad6beb33c3a4629f2d61e24d3007c7a5c 100644 (file)
--- a/main.c
+++ b/main.c
@@ -32,6 +32,7 @@ const char *opts_output   = "progs.dat";
 int         opts_standard = COMPILER_GMQCC;
 bool        opts_debug    = false;
 bool        opts_memchk   = false;
+bool        opts_dumpfin  = false;
 bool        opts_dump     = false;
 bool        opts_werror   = false;
 bool        opts_forcecrc = false;
@@ -237,6 +238,10 @@ static bool options_parse(int argc, char **argv) {
                 opts_dump = true;
                 continue;
             }
+            if (!strcmp(argv[0]+1, "dumpfin")) {
+                opts_dumpfin = true;
+                continue;
+            }
             if (!strcmp(argv[0]+1, "memchk")) {
                 opts_memchk = true;
                 continue;
index 94bcc620bd141b72699a0442deb36bad48232638..dec6a77a412348b0d84b5a35725ea657ff453987 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -3921,6 +3921,10 @@ bool parser_finish(const char *output)
                 ir_builder_delete(ir);
                 return false;
             }
+        }
+        if (opts_dump)
+            ir_builder_dump(ir, con_out);
+        for (i = 0; i < vec_size(parser->functions); ++i) {
             if (!ir_function_finalize(parser->functions[i]->ir_func)) {
                 con_out("failed to finalize function %s\n", parser->functions[i]->name);
                 ir_builder_delete(ir);
@@ -3929,7 +3933,7 @@ bool parser_finish(const char *output)
         }
 
         if (retval) {
-            if (opts_dump)
+            if (opts_dumpfin)
                 ir_builder_dump(ir, con_out);
 
             generate_checksum(parser);