/*
- * Copyright (C) 2012
+ * Copyright (C) 2012, 2013
* Wolfgang Bumiller
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
int outtype;
/* 'const' vs 'var' qualifier */
int cvq;
+ uint32_t flags;
struct ir_instr_s **reads;
struct ir_instr_s **writes;
ir_value **living;
/* For the temp-allocation */
+ size_t entry_id;
size_t eid;
bool is_return;
- size_t run_id;
struct ir_function_s *owner;
size_t run_id;
struct ir_builder_s *owner;
+
+ /* vararg support: */
+ size_t max_varargs;
} ir_function;
#define IR_FLAG_HAS_ARRAYS (1<<1)
#define IR_FLAG_HAS_UNINITIALIZED (1<<2)
#define IR_FLAG_HAS_GOTO (1<<3)
-#define IR_FLAG_MASK_NO_OVERLAP (IR_FLAG_HAS_ARRAYS | IR_FLAG_HAS_UNINITIALIZED)
+#define IR_FLAG_INCLUDE_DEF (1<<4)
+#define IR_FLAG_MASK_NO_OVERLAP (IR_FLAG_HAS_ARRAYS | IR_FLAG_HAS_UNINITIALIZED)
+#define IR_FLAG_MASK_NO_LOCAL_TEMPS (IR_FLAG_HAS_ARRAYS | IR_FLAG_HAS_UNINITIALIZED)
ir_function* ir_function_new(struct ir_builder_s *owner, int returntype);
void ir_function_delete(ir_function*);
const char **filenames;
qcint *filestrings;
/* we cache the #IMMEDIATE string here */
- qcint str_immediate;
+ qcint str_immediate;
+ /* there should just be this one nil */
+ ir_value *nil;
+ ir_value *reserved_va_count;
} ir_builder;
ir_builder* ir_builder_new(const char *modulename);
ir_value* ir_builder_get_field(ir_builder*, const char *fun);
ir_value* ir_builder_create_field(ir_builder*, const char *name, int vtype);
-bool ir_builder_generate(ir_builder *self, const char *filename);
+ir_value* ir_builder_get_va_count(ir_builder*);
+
+bool ir_builder_generate(code_t *, ir_builder *self, const char *filename);
void ir_builder_dump(ir_builder*, int (*oprintf)(const char*, ...));
-/* This code assumes 32 bit floats while generating binary */
-extern int check_int_and_float_size
-[ (sizeof(int32_t) == sizeof(qcfloat)) ? 1 : -1 ];
+
+/*
+ * This code assumes 32 bit floats while generating binary
+ * Blub: don't use extern here, it's annoying and shows up in nm
+ * for some reason :P
+ */
+typedef int static_assert_is_32bit_float [(sizeof(int32_t) == 4)?1:-1];
+typedef int static_assert_is_32bit_integer[(sizeof(qcfloat) == 4)?1:-1];
#endif