Compare commits

...

8 commits
main ... 0.2.2

Author SHA1 Message Date
Wolfgang Bumiller
de24486e54 Bump to patch level 2 2012-12-27 14:44:54 +01:00
Wolfgang Bumiller
e26d1e985a fix segfault from previous cherry-pick 2012-12-27 14:43:31 +01:00
Wolfgang Bumiller
cac827d763 Actually generate the vector member ir_values in ir_function_finalize, since ir_builder_gen_global is too late / happens after life ranges; this should fix -Ooverlap-locals
Conflicts:
	ir.c
2012-12-27 14:38:47 +01:00
Wolfgang Bumiller
9a87c5aac7 manpage: -dump, -dumpfin 2012-12-27 14:37:44 +01:00
Wolfgang Bumiller
b2165f718b Another bool->int fix; now clang-compiled gmqcc actually works... 2012-12-27 14:35:25 +01:00
Wolfgang Bumiller
9348649af4 Bump version to 0.2.1 2012-12-23 21:58:14 +01:00
Wolfgang Bumiller
11ffe61314 Even safer vector macros 2012-12-23 21:51:48 +01:00
Wolfgang Bumiller
b54f0a64de Fixing vector macros 2012-12-23 21:51:45 +01:00
4 changed files with 56 additions and 15 deletions

View file

@ -116,6 +116,17 @@ them.
-f\fIno-\fRcorrect-ternary
.fi
.in
.TP
.B "-dump"
DEBUG OPTION. Print the code's intermediate representation before the
optimization and finalization passes to stdout before generating the
binary.
.TP
.B "-dumpfin"
DEBUG OPTION. Print the code's intermediate representation after the
optimization and finalization passes to stdout before generating the
binary. The instructions will be enumerated, and values will contain a
list of liferanges.
.SH COMPILE WARNINGS
.TP
.B -Wunused-variable

12
gmqcc.h
View file

@ -41,7 +41,7 @@
#define GMQCC_VERSION_MAJOR 0
#define GMQCC_VERSION_MINOR 2
#define GMQCC_VERSION_PATCH 0
#define GMQCC_VERSION_PATCH 2
#define GMQCC_VERSION_BUILD(J,N,P) (((J)<<16)|((N)<<8)|(P))
#define GMQCC_VERSION \
GMQCC_VERSION_BUILD(GMQCC_VERSION_MAJOR, GMQCC_VERSION_MINOR, GMQCC_VERSION_PATCH)
@ -295,16 +295,16 @@ void _util_vec_grow(void **a, size_t i, size_t s);
/* exposed interface */
#define vec_meta(A) (((vector_t*)(A)) - 1)
#define vec_free(A) ((A) ? (mem_d((void*)vec_meta(A)), (A) = NULL) : 0)
#define vec_push(A,V) (GMQCC_VEC_WILLGROW(A,1), (A)[vec_meta(A)->used++] = V)
#define vec_push(A,V) (GMQCC_VEC_WILLGROW((A),1), (A)[vec_meta(A)->used++] = (V))
#define vec_size(A) ((A) ? vec_meta(A)->used : 0)
#define vec_add(A,N) (GMQCC_VEC_WILLGROW(A,N), vec_meta(A)->used += (N), &(A)[vec_meta(A)->used-(N)])
#define vec_add(A,N) (GMQCC_VEC_WILLGROW((A),(N)), vec_meta(A)->used += (N), &(A)[vec_meta(A)->used-(N)])
#define vec_last(A) ((A)[vec_meta(A)->used - 1])
#define vec_pop(A) (vec_meta(A)->used -= 1)
#define vec_shrinkto(A,N) (vec_meta(A)->used = (N))
#define vec_shrinkby(A,N) (vec_meta(A)->used -= (N))
#define vec_append(A,N,S) memcpy(vec_add(A, N), S, N * sizeof(*S))
#define vec_upload(X,Y,S) memcpy(vec_add(X, S * sizeof(*Y)), Y, S * sizeof(*Y))
#define vec_remove(A,I,N) memmove((char*)A+I*sizeof(*A),(char*)A+(I+N)*sizeof(*A),sizeof(*A)*(vec_meta(A)->used-I-N)),vec_meta(A)->used-=(N)
#define vec_append(A,N,S) memcpy(vec_add((A), (N)), (S), (N) * sizeof(*(S)))
#define vec_upload(X,Y,S) memcpy(vec_add((X), (S) * sizeof(*(Y))), (Y), (S) * sizeof(*(Y)))
#define vec_remove(A,I,N) memmove((A)+(I),(A)+((I)+(N)),sizeof(*(A))*(vec_meta(A)->used-(I)-(N))),vec_meta(A)->used-=(N)
typedef struct hash_table_t {
size_t size;

46
ir.c
View file

@ -728,6 +728,8 @@ bool ir_function_pass_tailrecursion(ir_function *self)
bool ir_function_finalize(ir_function *self)
{
size_t i;
if (self->builtin)
return true;
@ -748,6 +750,27 @@ bool ir_function_finalize(ir_function *self)
if (!ir_function_naive_phi(self))
return false;
for (i = 0; i < vec_size(self->locals); ++i) {
ir_value *v = self->locals[i];
if (v->vtype == TYPE_VECTOR ||
(v->vtype == TYPE_FIELD && v->outtype == TYPE_VECTOR))
{
ir_value_vector_member(v, 0);
ir_value_vector_member(v, 1);
ir_value_vector_member(v, 2);
}
}
for (i = 0; i < vec_size(self->values); ++i) {
ir_value *v = self->values[i];
if (v->vtype == TYPE_VECTOR ||
(v->vtype == TYPE_FIELD && v->outtype == TYPE_VECTOR))
{
ir_value_vector_member(v, 0);
ir_value_vector_member(v, 1);
ir_value_vector_member(v, 2);
}
}
ir_function_enumerate(self);
if (!ir_function_calculate_liferanges(self))
@ -998,16 +1021,22 @@ ir_value* ir_value_vector_member(ir_value *self, unsigned int member)
if (self->members[member])
return self->members[member];
len = strlen(self->name);
name = (char*)mem_a(len + 3);
memcpy(name, self->name, len);
name[len+0] = '_';
name[len+1] = 'x' + member;
name[len+2] = '\0';
if (self->name) {
len = strlen(self->name);
name = (char*)mem_a(len + 3);
memcpy(name, self->name, len);
name[len+0] = '_';
name[len+1] = 'x' + member;
name[len+2] = '\0';
}
else
name = NULL;
if (self->vtype == TYPE_VECTOR)
{
m = ir_value_var(name, self->store, TYPE_FLOAT);
mem_d(name);
if (name)
mem_d(name);
if (!m)
return NULL;
m->context = self->context;
@ -1020,7 +1049,8 @@ ir_value* ir_value_vector_member(ir_value *self, unsigned int member)
if (self->fieldtype != TYPE_VECTOR)
return NULL;
m = ir_value_var(name, self->store, TYPE_FIELD);
mem_d(name);
if (name)
mem_d(name);
if (!m)
return NULL;
m->fieldtype = TYPE_FLOAT;

View file

@ -4454,7 +4454,7 @@ skipvar:
ast_unref(cval);
}
} else {
bool cvq;
int cvq;
shunt sy = { NULL, NULL };
cvq = var->cvq;
var->cvq = CV_NONE;