Commit graph

177 commits

Author SHA1 Message Date
Bill Currie
23c9a317f8 [qfcc] Give alias expressions their own type
While this was a pain to get working, that pain only went to prove the
value of using proper "types" (even if only an enum) for different
expression types: just finding all the places to edit was a chore, and
easy to make mistakes (forgetting bits here and there).

Strangely enough, this exposed a pile of *type* aliasing bugs (next
commit).
2022-01-08 12:06:52 +09:00
Bill Currie
f5be54b6d2 [qfcc] Sanitize expr type enum
Got tired of dealing with out of date string tables.
2022-01-07 23:12:20 +09:00
Bill Currie
c9b2a740a0 [gamecode] Add etypes for long and ulong
And partial implementations in qfcc (most places will generate an
internal error (not implemented) or segfault, but some low-hanging fruit
has already been implemented).
2022-01-05 22:32:07 +09:00
Bill Currie
8385046486 [qfcc] Warn when super dealloc invocation is missing
Forgetting to invoke [super dealloc] in a derived class's -dealloc
method has caused me to waste far too much time chasing down the
resulting memory leaks and crashes. This is actually the main focus of
issue #24, but I want to take care of multiple paths before I consider
the issue to be done.

However, as a bonus, four cases were found :)
2021-12-24 22:45:43 +09:00
Bill Currie
ff1cdb6f89 [qfcc] Give select expressions their own type
While get_selector does the job of getting a selector from a selector
reference expression, I have long considered lumping various expression
types under ex_expr to be a mistake. Not only is this a step towards
sorting that out, it will make working on #24 easier.
2021-12-24 22:45:43 +09:00
Bill Currie
38a6ccdc85 [qfcc] Use indexed initializers for expr functions
This will make adding new expression types easier (though the current
reason for doing so has been abandoned for now).
2021-06-28 18:12:15 +09:00
Bill Currie
1eef2a8b5e [qfcc] Implement type aliasing again
When a type is aliased, the alias has two type chains: the simple type
chain with all other aliases stripped, and the full type chain. There
are still plenty of bugs in it, but having the clean type chain takes
care of the major issue that was in the previous attempt as only the
head of the type-chain needs to be skipped for type comparison.

Most of the bugs are in finding the locations where the head needs to be
skipped.
2020-03-28 12:10:23 +09:00
Bill Currie
6ec92fb83b [qfcc] Point pointer tempop to the operand
It turns out I need the operand itself, not just the tempop.
2020-03-17 15:47:42 +09:00
Bill Currie
9cb3ee01d6 [qfcc] Add pointer value check
Extraction is a little more complicated, though, so undecided on that.
2020-03-17 11:19:12 +09:00
Bill Currie
c3f04384d5 [qfcc] Make a general integral value extractor
All too often I just want the value.
2020-03-17 11:18:37 +09:00
Bill Currie
888192a9ea [qfcc] Resurrect ex_def expression type
It turns out to be useful still as using symbol expressions isn't always
appropriate and the workarounds were getting nasty.
2020-03-17 01:42:46 +09:00
Bill Currie
a0c28a5ac5 [qfcc] Support pointers to temp operands
This is necessary for correctly taking the address of operands.
2020-03-16 14:24:47 +09:00
Bill Currie
72f4b8ccb5 [qfcc] Give address operands a good expression
That is, those created by operand_address. The dag code needs the
expression that is attached to the statement to have the correct
expression type in order to do the right thing with the operands and
aliasing, especially when generating temps. This fixes assignchain when
optimizing (all tests pass again).
2020-03-14 19:26:47 +09:00
Bill Currie
eca976e5ae [qfcc] Expose l-value checking
Needed for assignment chains.
2020-03-14 17:45:54 +09:00
Bill Currie
7cc51c9ca3 [qfcc] Save block expression creator's address
I've already found the bug that necessitated it (and the creator was
innocent), but it will help later.
2020-03-14 12:27:23 +09:00
Bill Currie
f738639d68 Revert "[qfcc} Mark some more functions as pure"
This reverts commit 65b48c734c.

I forgot that get_type calls convert_name, which most definitely is not
pure. Fixes the segfault in scheme.
2020-03-13 19:58:34 +09:00
Bill Currie
c04f1c0156 [qfcc] Really delay the conversion of nil
Now convert_nil only assigns the nil expression a type, and nil makes
its way down to the statement emission code (where it belongs, really).
Breaks even more things :)
2020-03-13 18:19:43 +09:00
Bill Currie
65b48c734c [qfcc} Mark some more functions as pure
I guess gcc doesn't consider recursive functions as pure, but marking
get_type as pure had a slight ripple effect.
2020-03-12 19:40:17 +09:00
Bill Currie
21a8559674 [qfcc] Improve handling of nil assignments
Especially when they result in using memset.
2020-03-12 19:40:17 +09:00
Bill Currie
5d349efe78 [qfcc] Delay conversion of nil in assignments
It's not possible to take the address of constants (at this stage) and
trying to use a move instruction with .zero as source would result in
the VM complaining about null pointer access when bounds checking is on.
Thus, don't convert a nil source expression until it is known to be
safe, and use memset when it is not.
2020-03-11 22:57:48 +09:00
Bill Currie
be5f11f33a [qfcc] Support the new memset instructions 2020-03-11 22:57:20 +09:00
Bill Currie
b6439e8dc1 [qfcc] Support compound init in assignment and params
foo({...}) and bar = {...}
2020-03-11 19:48:25 +09:00
Bill Currie
d1e83b9d48 [qfcc] Create a compound initializer expression type
This fixes the problem of using the return value of a function as an
element in a compound initializer. The cause of the problem is that
compound initializers were represented by block expressions, but
function calls are contained within block expressions, so def
initialization saw the block expression and thought it was a nested
compound initializer.

Technically, it was a bug in the nested element parsing code in that it
wasn't checking the result value of the block expression, but using a
whole new expression type makes things much cleaner and the work done
paves the way for labeled initializers and compound assignments.
2020-03-11 15:46:57 +09:00
Bill Currie
393e540ffa [qfcc] Print the source name of an undefined label
Undefined labels generated by the compiler indicate severe trouble.
2020-03-11 13:31:12 +09:00
Bill Currie
1cd5ea5732 [qfcc] Add support for named labels in statements
Yeah, I've finally decided to implement goto. Limited to function scope
of course.
2020-03-11 12:49:10 +09:00
Bill Currie
5535a6a509 [qfcc] Fix missing words in a comment 2020-03-11 10:49:49 +09:00
Bill Currie
9acfdea8b5 [qfcc] Improve line number binding for function calls
Multi-line calls (especially messages) got rather confusing to read as
the lines jumped back and forth. Now the binding is better but the dags
code is reordering the parameters sometimes.
2020-03-11 01:52:45 +09:00
Bill Currie
b4aebc120e [qfcc] Treat { } as nil for initializing compound types 2020-02-27 20:30:39 +09:00
Bill Currie
e23aa40994 Implicitly cast unadorned floating point constants
Floating point constants without f or d adornments will automatically
cast, without warnings, to the type appropriate to the rest of the
expression.
2020-02-23 22:28:54 +09:00
Bill Currie
14cde99d6e White space
of the worst sort.
2020-02-23 22:27:07 +09:00
Bill Currie
ea3af84baa Fix ICE when const-folding doubles
I really need to rework that system.
2020-02-23 20:49:56 +09:00
Bill Currie
1b43046c8a Handle aliased types when building function calls 2020-02-19 21:41:46 +09:00
Bill Currie
533fb8acc9 Implement double constants 2020-02-15 23:49:12 +09:00
Bill Currie
df7c08a010 Add support for doubles to Ruamoko
Only as scalars, I still need to think about what to do for vectors and
quaternions due to param size issues. Also, doubles are not yet
guaranteed to be correctly aligned.
2020-02-15 23:49:12 +09:00
Bill Currie
9248e8cf01 Update for doxygen 1.8.16 2020-02-11 15:22:42 +09:00
Bill Currie
913b9f52e0 Add an offset alias expression
This should make dealing with def elements (vector etc) easier.
2019-06-10 18:13:28 +09:00
Bill Currie
efdfc7436f Move ev_types into types.[ch]
No wonder I couldn't find it the other day...
2019-06-10 18:04:25 +09:00
Bill Currie
ec89149b29 Build for loop decl inits correctly
The multiple expressions are chained together and evaluate in left to
right order.
2019-06-09 13:54:03 +09:00
Bill Currie
df0316bb13 Clean up some comment FIXMEs 2019-06-08 19:22:29 +09:00
Bill Currie
6c53be928b Support returning vector expressions.
Currently fails due to a scheduling problem when the vector expression
contains functions.
2018-10-13 23:32:53 +09:00
Bill Currie
aaab18c9a7 Nuke a dead field.
It looks like ex_temp_t.expr was never really used, and I have no idea
what I had intended (not surprising after ~17 years).
2018-10-13 12:07:50 +09:00
Bill Currie
78e0a8dc52 Support assigning non-constant vector expressions. 2018-10-12 22:05:17 +09:00
Bill Currie
71b3d30aa1 Make the ice a little more informative. 2018-10-12 14:51:39 +09:00
Bill Currie
34bcf7faab Do a pure/const/noreturn/format attribute pass.
I always wanted these, but as gcc now provides warnings for functions that
could do with such attributes, finding all the functions is much easier.
2018-10-09 12:42:21 +09:00
Bill Currie
db460155e9 Fix multiple function calls in expressions. 2013-09-27 23:15:57 +09:00
Bill Currie
3295370328 Expose and use field_expr().
This may cause problems later on, but it is needed for the binary_expr()
cleanup.
2013-09-27 23:15:57 +09:00
Bill Currie
ca9693d9cd Expose convert_from_bool(). 2013-09-27 23:15:57 +09:00
Bill Currie
7f50333b2c Add support for constant [] vector expressions. 2013-09-27 23:15:57 +09:00
Bill Currie
7a7a685105 Add support for actual vector expressions.
Currently, they can represent either vectors or quaternions, and the
quaternions can be in either [s, v] form or [w, x, y, z] form.

Many things will not actual work yet as the vector expression needs to be
converted into the appropriate form for assigning the elements to the
components of the "vector" type.
2013-09-27 23:15:57 +09:00
Bill Currie
a6cdc8735a Start implementing vec = [x,y,z].
This is a nice feature found in fteqcc (also a bit of a challenge from
Spike). Getting bison to accept the new expression required rewriting the
state expression grammar, so this is mostly for the state expression. A
test to ensure the state expression doesn't break is included.
2013-09-27 23:15:56 +09:00