Commit graph

4278 commits

Author SHA1 Message Date
Bill Currie
3c2f6c8447 [qfcc] Simplify flow_analyize_pointer_operand
and its usage. The parts of flow_analyze_statement that use it know
where the returned operand needs to go. Unfortunately, this breaks dags
pretty hard, but that's because dags needs to learn about the fancy
assignment-type statements.
2020-03-17 21:30:16 +09:00
Bill Currie
dec2e6249e [qfcc] Increase flow operand count to 5
MOVEP instructions have up to 5 operands: 2 pointers, the count, and 0-2
referenced variables (when known).
2020-03-17 21:24:12 +09:00
Bill Currie
fa2cbc72d8 [qfcc] Analyze tempop pointers in move/memset statements 2020-03-17 15:48:06 +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
0de011d0bf [qfcc] Add some disabled additional statement info
It's a bit cluttered for normal debugging, but I haven't decided how to
make it optional just yet.
2020-03-17 15:23:24 +09:00
Bill Currie
c5cbe83f71 [qfcc] Initialize statement numbers to -1
This is to indicate the statement has not yet been flow analyzed.
2020-03-17 15:05:58 +09:00
Bill Currie
d02a01c282 [qfcc] Make tempop pointer strings more informative
Now that the address of a tempop can be taken, their op strings need to
be visible.
2020-03-17 15:05:58 +09:00
Bill Currie
441e7b99bc [qfcc] Correctly implement pointer arithmetic 2020-03-17 13:39:22 +09:00
Bill Currie
c5400c4581 [qfcc] Make anonstruct test robust against pointer math
I noticed that pointer math is currently incorrect in qfcc, but it would
be nice for fixing it to not break anonstruct since it is testing
something else.
2020-03-17 12:16:24 +09:00
Bill Currie
0d784d9ef4 [qfcc] Rework address expr calculation
This removes a bogus lea from the instruction stream (and there can be
many such).
2020-03-17 12:13:09 +09:00
Bill Currie
0d751dcdc5 [qfcc] Improve robustness of do_op_integer 2020-03-17 12:12:06 +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
80967e1471 [qfcc] Support def exprs in integral value extractors 2020-03-17 10:56:45 +09:00
Bill Currie
e4a403bbb3 [qfcc] Improve integral value extraction readability 2020-03-17 10:55:27 +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
fd06cd2b00 [qfcc] Analyze assignment through const pointers
This fixes a false-positive uninitialized warning.
2020-03-17 01:40:35 +09:00
Bill Currie
8e6baf1bde [qfcc] Fix assigning to entity fields
At least for basic types. Compound types need testing.
2020-03-17 01:39:35 +09:00
Bill Currie
f9face0cef [qfcc] Make is_indirect easier to read 2020-03-16 23:26:39 +09:00
Bill Currie
5c0c056e2c [qfcc] Add is_entity type test helper 2020-03-16 21:07:31 +09:00
Bill Currie
ede7dd6d7e [qfcc] Catch attempts to emit a bad operand type 2020-03-16 20:31:21 +09:00
Bill Currie
1d10136f2e [qfcc] Treat all dereferences and indirect
Why I had a const pointer test on there is beyond me.
2020-03-16 20:24:22 +09:00
Bill Currie
69924fe717 [qfcc] Return correct value for is_const_ptr
It really helps if the logic is not inverted.
2020-03-16 20:21:07 +09:00
Bill Currie
db06300ddd [qfcc] Make print_operand usable from gdb
It not emitting a \n made life difficult, especially whenever gdb
decided to make access to printf or puts awkward.
2020-03-16 20:20:07 +09:00
Bill Currie
c8e45c6cfc [qfcc] Use operand_address in expr_deref
This fixes the technically correct but horrible mess of temps and
addressing when dealing with ivars, and the resulting uninitialized
temps due to the non-constant pointers (do need statement level constant
folding, though).
2020-03-16 14:24:48 +09:00
Bill Currie
b58deb5680 [qfcc] Rewrite operand_address to be much simpler
It now creates a pointer value and returns that rather than generating
an address statement.
2020-03-16 14:24:47 +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
2f07d9a310 [qfcc] Improve accuracy of some more diagnostics 2020-03-16 10:42:18 +09:00
Bill Currie
0fe3fda44d [qfcc] Fix protocol adorned id as message receiver
This took a bit as type_id has no class data, only protocols attached to
the type_obj_object instance, and then protocol lists can get deep.
2020-03-16 10:42:18 +09:00
Bill Currie
ea042cf87a [qfcc] Split out the obj-qc specific expr code 2020-03-16 10:34:16 +09:00
Bill Currie
fb33a7f2a7 [qfcc] Remove "impossible" code
It is not possible to adorn Class with protocols, so no need to check
for them when checking if a type is a class.
2020-03-16 10:34:16 +09:00
Bill Currie
e1140d476a [qfcc] Handle syntax errors in method protos 2020-03-15 16:19:45 +09:00
Bill Currie
968de155a1 [qfcc] Make some counts unsigned
How do you have -1 def?
2020-03-15 01:33:25 +09:00
Bill Currie
9a08a51ebd [qfcc] Ensure progs defs are sorted by address 2020-03-15 01:32:38 +09:00
Bill Currie
067bc264fa [qfcc] Set local def size in debug sym file
It was getting random garbage. Not good for debuggers.
2020-03-14 22:08:27 +09:00
Bill Currie
20fd5eb80c [qfcc] Show def size when dumping defs 2020-03-14 22:07:36 +09:00
Bill Currie
327d692992 [qfcc] Correct order of @zero fields
This is part of what messed up float_val in the encoding for @params.
The other part is something in the linker type encoding merge code: it
may be too aggressive. It's also what messed up the size of @params.
2020-03-14 22:06:57 +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
025dd63493 [qfcc] Bubble right-hand assignee back up chain
This fixes assignchain when not optimizing. There are problems in dags,
though, with address expressions.
2020-03-14 17:48:53 +09:00
Bill Currie
97e0c23529 [qfcc] Create a nil operand
This is for struct assignments so they can pass the source operand back
up the assignment chain.
2020-03-14 17:47:23 +09:00
Bill Currie
eca976e5ae [qfcc] Expose l-value checking
Needed for assignment chains.
2020-03-14 17:45:54 +09:00
Bill Currie
7d5644e055 [qfcc] Save operand creator return address 2020-03-14 17:44:54 +09:00
Bill Currie
51a30de9c5 [qfcc] Print accurate linenos for more ICEs 2020-03-14 16:51:54 +09:00
Bill Currie
6608c8a1f6 Revert "Support taking the address of block expressions that have a result."
This reverts commit c78d15b331.

While a block expression's result may be an l-value, block expressions
are not (and their results may not be), thus taking the address of one
is not really correct. It seems the only place that tries to do so is
the assignment code when dealing with structures.
2020-03-14 13:14:25 +09:00
Bill Currie
277ff719f5 Revert "Do not lose the block expression when taking its address."
This reverts commit b49d90e769.

I suspect this was a workaround for the mess in assignment chains.
However, it caused compile errors with the new implementation, and is
just bogus anyway.
2020-03-14 12:30:18 +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
d30c895c13 [qfcc] Use correct assignment statement type
Just another minor detail lost in the assignment rewrite. With this, all
tests pass when optimizing.
2020-03-14 11:36:42 +09:00
Bill Currie
a98f0e04eb [qfcc] Correct some misinformative prints 2020-03-14 01:28:00 +09:00
Bill Currie
b1459ac816 [qfcc] Move return save temp into call block
This fixes func-expr after the assignment rewrite. Now all tests pass
when not optimizing (something not quite right in assignchain when
optimizing).
2020-03-14 01:24:13 +09:00
Bill Currie
57134e01cd [qfcc] Handle l-value pointer dereferences again
While I still hate ".=", at least it's more hidden, and the new
implementation is a fair bit cleaner (hah, goto a label in an if (0) {}
block).

Most importantly, the expression tree code knows nothing about it. Now
just to figure out what broke func-epxr. A bit of whack-a-mole, but yay
for automated tests.
2020-03-14 01:04:05 +09:00
Bill Currie
d150210888 [qfcc] Nuke PAS from orbit
And there was much rejoicing. I hated having to create that opcode.
2020-03-13 21:03:48 +09:00
Bill Currie
de89f2f31f [qfcc] Fix a test that wasn't failing when it should 2020-03-13 20:47:57 +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
e22579d70e [qfcc] Analyze memset target pointer
This fixes the false uninitialized warnings cause by nil migration.
2020-03-13 18:28:54 +09:00
Bill Currie
3d88c3845f [qfcc] Move struct copy/set into statement emission
Doing it in the expression trees was a big mistake for a several
reasons. For one, expression trees are meant to be target-agnostic, so
they're the wrong place for selecting instruction types. Also, the move
and memset expressions broke "a = b = c;" type expression chains.

This fixes most things (including the assignchain test) with -Werror
turned off (some issues in flow analysis uncovered by the nil
migration: memset target not extracted).
2020-03-13 18:20:38 +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
19002116c2 [qfcc] Fix missing expression types from dot_expr 2020-03-13 17:56:07 +09:00
Bill Currie
2c9c15f4c8 [qfcc] Add a type check helper for structural types
ie, struct/union/array. I finally though up a decent name (didn't want
to use record as that's a pascal type).
2020-03-13 17:54:05 +09:00
Bill Currie
8d10b0f4aa [qfcc] Support compound initializers for return 2020-03-13 09:58:52 +09:00
Bill Currie
047131a737 [qfcc] Check for compound init in message args
I had forgotten message sending did its own type checking and thus
needed to be updated for compound initializers in message parameters.
2020-03-13 09:46:36 +09:00
Bill Currie
9c06b22719 [qfcc] Fix segfault when assigning {} 2020-03-13 01:59:35 +09:00
Bill Currie
9c5fac2226 [qfcc] Catch another assignment chain failure 2020-03-12 19:53:15 +09:00
Bill Currie
f454842361 [qfcc] Add breaking assignment chain test
This bug drove me nuts for several hours until I figured out what was
going on.
The assignment sub-tree is being generated, then lost. It works for
simple assignments because a = b = c -> (= a (= b c)), but for complex
assignments (those that require move or memset), a = b = c -> (b = c) (a
= c) but nothing points to (b = c). The cause is using binary
expressions to store assignments.
2020-03-12 19:47:09 +09:00
Bill Currie
4c2a6c9eb2 [qfcc] Allow implicit demotion in initializer elements
Notably, implicit double constants (no adorning d) being used to
initialize float struct members.
2020-03-12 19:40:17 +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
c743583003 [qfcc] Fix a comment 2020-03-12 19:40:17 +09:00
Bill Currie
bbfd498b74 [qfcc] Handle compound and memset dot nodes
compound is currently not very informative, but it's better than "bad
expression type"
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
e4caf50ee1 [qfcc] Update switch tables for compound initializers
Forgot to do a full test build (Machine.r found it)
2020-03-11 23:52:12 +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
d418be31e6 [qfcc] Tweak ivar test to check old bug
It turns out that assigning nil to an ivar struct does not work (should,
of course).
2020-03-11 20:55:21 +09:00
Bill Currie
48a256efaa [qfcc] Fix segfault when assigning {}
I had intended to check, but forgot.
2020-03-11 20:45:25 +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
afd31ed292 [qfcc] Rename cexpr to comma_expr
It took me too long to figure out what cexpr was for.
2020-03-11 16:07:58 +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
f10f9e157d [qfcc] Warn about unused labels 2020-03-11 13:33:06 +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
813319efc2 [qfcc] Implement goto
It's just too useful when used correctly.
2020-03-11 12:53:40 +09:00
Bill Currie
4a8854d9ed [qfcc] Add expression tracking to operands
Not much uses it yet, but it will make for better diagnostics.
2020-03-11 12:51:34 +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
d5560434c0 [qfcc] Rename label to bool_label for clarity
And also so I can use `label' for source labels.
2020-03-11 11:06:09 +09:00
Bill Currie
3061f7e30e [qfcc] Update sendv test for corrected implementation 2020-03-11 11:04:49 +09:00
Bill Currie
826f066e00 [qfcc] Be more consistent with string saving
Not that it really makes any difference for labels since they're
guaranteed unique, but it does remove the question of "why nva instead
of save_string?". Looking at history, save_string came after I changed
it from strdup (va()) to nva(), and then either didn't think to look for
nva or thought it wasn't worth changing.
2020-03-11 10:50:15 +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
a013714bd0 [qfcc] Add missing header file changes
Oops
2020-03-08 20:11:21 +09:00
Bill Currie
89ec86f77f [qfcc] Add option to promote of float through ...
The server code is not yet ready for doubles, especially in its varargs
builtins: they expect only floats. When float promotion is enabled
(default for advanced code, disabled for traditional or v6only),
"@float_promoted@" is written to the prog's strings.
2020-03-08 19:13:57 +09:00
Bill Currie
bcf75b541a [qfcc] Build movep dest pointer correctly
This fixes the mangled pointer in struct-init-param.r.
2020-03-08 17:40:38 +09:00
Bill Currie
5020966be3 [qfcc] Fix ud-chain alias handling
That was a fair bit trickier than I thought, but now .return and .paramN
are handled correctly, too, especially taking call instructions into
account (they can "kill" all 9 defs).
2020-03-08 16:57:12 +09:00
Bill Currie
3d9410c66d [qfcc] Force overlap to 0 for non-alias def/temops
Make the code behave as intended: visiting all aliases when starting
with the real def/tempop regardless of the overlap setting.
2020-03-08 16:53:28 +09:00
Bill Currie
035da472ec [qfcc] Offset alias tempop offsets
Alias tempop offsets are relative to the real tempop. This fixes alias
tempops never overlapping the real tempop.
2020-03-08 16:51:01 +09:00
Bill Currie
695b3ba0d0 [qfcc] Rearrange vecexpr.r for easier debugging
Putting the most likely function to have problems at the top reduces
break-point shenanigans.
2020-03-08 16:50:39 +09:00
Bill Currie
d9d321f65b [qfcc] Check for previous errors in vector exprs
Fixes a segfault when one of the expressions used to construct the
vector was the result of an error.
2020-03-08 15:40:07 +09:00
Bill Currie
b81d58c795 Revert "[qfcc] Correct a comment"
This reverts commit a2f203c840.

There is indeed a world of difference between "any" and "only", and it
helps if I read the rest of the docs AND the code :P.
2020-03-08 14:58:57 +09:00
Bill Currie
8696e76a25 [qfcc] Handle aliases when setting use and def
As expected, this does not fix the mangled pointer problem in
struct-init-param.r, but it does improve the ud-chains. There's still a
problem with .return, but it's handling in flow_analyze_statement is a
bit "special" :P.
2020-03-08 12:17:56 +09:00
Bill Currie
a2f203c840 [qfcc] Correct a comment
There's a world of difference between "any" and "only".
2020-03-08 12:10:12 +09:00
Bill Currie
b2faca16a7 [qfcc] Rename the kill alias functions
Having "visit" in the name felt redundant in the end.
2020-03-08 12:08:56 +09:00
Bill Currie
c2ed6d41bd [qfcc] Finish struct-init-param test
When the bug is fixed, it will pass now (does without optimization).
2020-03-08 03:55:08 +09:00
Bill Currie
e4c87091a3 [qfcc] Lots of flow analysis docs
And some function shuffling for grouping. I'm not satisfied with the
docs, but they're a lot more helpful than they were.
2020-03-08 03:53:53 +09:00
Bill Currie
809c103fd1 [qfcc] Shuffle some code around to be clearer
Doing the same thing at the end of two branches of an if/else seems off.

And doing an associative(?) set operation every time through a loop is
wasteful.
2020-03-08 03:46:52 +09:00
Bill Currie
7338689146 [qfcc] Treat offset real tempops as an error
tempops always have an offset field, but only those that are aliases
should ever have a non-zero offset.
2020-03-08 03:42:18 +09:00
Bill Currie
d44d956038 [qfcc] Remove a long dead function 2020-03-08 03:39:24 +09:00
Bill Currie
f56de00c21 [qfcc] Rename a field
depth_first is much clearer than dfo. I had to check what dfo meant too
many times in one night.
2020-03-08 03:38:45 +09:00
Bill Currie
2b15e61b28 [qfcc] Remove obsolete structure fields
init_vars hasn't been used for a long time.
2020-03-08 03:33:01 +09:00
Bill Currie
e524db1fc1 [qfcc] Set op type when aliasing a value
This fixes the ICE when attempting to compile address-cast without
optimization (just realized why, too: the assignment was optimized out
of existence).
2020-03-08 03:11:46 +09:00
Bill Currie
6ada20f685 [qfcc] Show offset for op_x_def_ofs relocs 2020-03-07 02:06:33 +09:00
Bill Currie
48514ba2f3 [qfcc] Create alias def for defs accessed via pointer
This the fixes the incorrect flow analysis caused by the def being seen
to have the wrong size (structure field of structure def seen through a
constant pointer). Fixes the ICE, but the pointer constant is broken
somewhere in dags, presumably.
2020-03-07 01:30:36 +09:00
Bill Currie
faa6eabfbe [qfcc] Add a failing test for struct init to param
This actually took a bit to reproduce.
2020-03-06 22:28:04 +09:00
Bill Currie
f7757cf894 [qfcc] Add filename to dot output
It makes things so much easier when viewing the graphs
2020-03-06 21:05:53 +09:00
Bill Currie
de06efa604 [qfcc] Fix handling of nil for static initializers
nil is most definitely constant.
2020-03-06 20:38:40 +09:00
Bill Currie
9dbc81432a [qfcc] Use full type for differentiating values
This fixes the problem of using nil for two different compound types
within the one expression. The problem is all compound types have the
same low-level type (ev_invalid) and this caused the two different nils
to have the same type when taken back up to expression level.
2020-03-06 20:33:47 +09:00
Bill Currie
07e6baf32f [qfcc] Support { } as nil in nested initializers
Did top-level earlier, but forgot to add support for deeper nestings.
2020-03-06 20:32:37 +09:00
Bill Currie
9b269c2f8e [qfcc] Fix mangled method parameters
Method parameters (ie, extra parameters without selector names) were
getting reversed during function type construction.
2020-03-06 17:37:58 +09:00
Bill Currie
a2cebe3cac [qfcc] Add failing test for method parameters 2020-03-06 17:36:23 +09:00
Bill Currie
94e35b5f57 [qfcc] Clean up error messages around superclass 2020-03-05 21:10:15 +09:00
Bill Currie
66b8ab6890 [qfcc] Rework method ivar access
While expression symbols worked for what they are, they weren't so good
for ivar access because every ivar of a class (and its super classes)
would be accessed at method scope creation, generating spurious access
errors if any were private. That is, when the access checks worked at
all.
2020-03-05 18:45:47 +09:00
Bill Currie
5200c3f518 [qfcc] Update chewed-alias test for new warnings 2020-03-05 18:26:11 +09:00
Bill Currie
1bf56b28ac [qfcc] Warn when messaging a forward-declared class
But only once.
2020-03-05 15:39:34 +09:00
Bill Currie
59db90d177 [qfcc] Fix method not found warnings
It turns out they should not be optional, but do need to be smarter
about when and which. So another two FIXMEs gone :)
2020-03-05 14:48:53 +09:00
Bill Currie
669c8f43d8 whitespace 2020-03-05 14:48:49 +09:00
Bill Currie
ccaa4ad3d2 [qfcc] Catch assignment of void* to class pointers
id and other class pointers imply that the object can receive messages,
but void * has no such implication, so treat it as a mismatch.
2020-03-05 14:14:20 +09:00
Bill Currie
65a5e4f2a4 [qfcc] Allow inherited methods to satisfy protocols
I suspect that the current state of things will produce problems later
on, but this works for now.
2020-03-05 12:52:37 +09:00
Bill Currie
1459361cbd [qfcc] Set builtin function def flags
This fixes the missing redefinition error when a builtin is defined
twice (and thus corrupting the function chain).
2020-03-05 11:48:15 +09:00
Bill Currie
9ccfe8aefc [qfcc] Rewrite init_elements
The end goal was to fix erroneous non-constant initializer errors for
the following (ie, nested initializer blocks):

    typedef struct { int x; int y; } Point;
    typedef struct { int width; int height; } Extent;
    typedef struct Rect_s { Point offset; Extent extent; } Rect;
    Rect makeRect (int xpos, int ypos, int xlen, int ylen)
    {
	Rect rect = {{xpos, ypos}, {xlen, ylen}};
	return rect;
    }

However, it turned out that nested initializer blocks for local
variables did not work at all in that the relocations were lost because
fake defs were being created for the generated instructions.

Thus, instead of creating fake defs, simply record the offset relative
to the base def, the type, and the basic type initializer expression,
then generate instructions that all refer to the correct def but with a
relative offset.

Other than using the new element system, static initializers are largely
unaffected.
2020-03-05 11:05:13 +09:00
Bill Currie
1b2a806f28 [qfcc] Fix test that failed due to improved warnings 2020-03-05 11:04:22 +09:00
Bill Currie
78b71c28fe [qfcc] Make reloc functions const-correct 2020-03-05 11:03:23 +09:00
Bill Currie
efcbbbb641 [qfcc] Catch use of missing superclass interfaces 2020-03-05 08:50:29 +09:00
Bill Currie
896c14f33a [qfcc] Support anonymous structs in ivars
Missed this earlier.
2020-03-05 08:47:21 +09:00
Bill Currie
0bb4279a9f [qfcc] Handle bitwise not of enums
It looks like I need to handle other unary expressions too, but another
time.
2020-03-05 01:45:38 +09:00
Bill Currie
269a8a558a [qfcc] Allow bare enum and named struct declarations
Got a little overzealous there
2020-03-04 18:39:41 +09:00
Bill Currie
f532780dbe [qfcc] Treat opaque structs as not anonymous
I don't know why the segfault happened where it did, but
forward-declared structs certainly can't be used as anonymous structs.
2020-03-04 18:38:04 +09:00
Bill Currie
7a2335e9f4 [qfcc] Catch useless specifiers in function scope 2020-03-04 18:07:10 +09:00
Bill Currie
4c82114547 [qfcc] Catch several useless specifier expressions 2020-03-04 17:40:49 +09:00
Bill Currie
597890dda1 [qfcc] Catch duplicate field definitions 2020-03-04 16:32:04 +09:00
Bill Currie
e298904dc0 [qfcc] Implement anonymous structs and unions
For struct/union scope
2020-03-04 16:31:28 +09:00
Bill Currie
4fa203852a [qfcc] Use offset alias offset when creating alias of offset alias
Yes, that's correct. It happens when casting the address of a structure
field (for the test case this fixes, vector field).
2020-03-04 00:55:31 +09:00
Bill Currie
57b2751732 [qfcc] Add failing vector element address test
It's an evil thing to do, but it should at least work.
2020-03-04 00:37:10 +09:00
Bill Currie
b186332da0 [qfcc] Make initialization of external vars an error 2020-03-03 17:33:56 +09:00
Bill Currie
6def1fc01c [qfcc] Fix a bootstrap warning 2020-03-03 15:26:33 +09:00
Bill Currie
b8984e5f66 [qfcc] Fix another infinite loop in the linker
I think this should be it for infinite loops caused by undefined
symbols. I don't know why I didn't remove this continue when I removed
the other.
2020-03-03 13:39:24 +09:00
Bill Currie
c7cde5f409 [qfcc] Pass gcc's purity test
*sigh*
2020-03-03 10:59:01 +09:00
Bill Currie
16223098e5 [qfcc] Fix ivar visibility
It was broken by the big rewrite and I forgot to fix it.
2020-03-03 10:42:05 +09:00
Bill Currie
ed04e6fc23 [qfcc] Merge method lists instead of copying
This is for adding methods to classes and protocols via their interface,
not for adding methods by adding protocols (they still get copied).
Slightly more memory efficient.
2020-03-03 00:11:54 +09:00
Bill Currie
f025bd96d4 [qfcc] Copy self param when copying methods
Copying methods is done when adding protocols to classes (the current
use for adding regular methods is an incorrect solution to a different
problem). However, when a method is added to a class, the type of its
self parameter is set to be a pointer to the class. Thus, not only does
the method need to be copied, the self parameter does too, otherwise
the self parameter of methods added via protocols will have their type
set to be a pointer to the last class seen adding the protocol.

That is, if, while compiling the implementation for class A, but the
interface for class B is comes after the interface for class A, and both
A and B add protocol P, then all methods in protocol P will have self
pointing to B rather than A.

@protocol P
-method;
@end

@interface A <P>
@end

@interface B <P>
@end

@implementation A
-method	{} // self is B, not A!
@end
2020-03-02 23:46:26 +09:00
Bill Currie
8a4de6fea6 [qfcc] Fix segmentation fault for parameter errors 2020-03-02 22:38:12 +09:00
Bill Currie
f6d650d473 [qfcc] Merge duplicate methods in interfaces
Duplicate methods in an interface (especially across protocols and
between protocols and the interface) are both harmless and even to be
expected. They certainly should not cause the compiler to demand
duplicate method implementations :)
2020-03-02 21:15:21 +09:00
Bill Currie
e33d83fc9e [qfcc] Accept "struct foo; struct foo { ... };"
That is, do not treat structure definition after declaration to be a
redefinition.
2020-03-02 20:16:29 +09:00
Bill Currie
5893bd7501 [qfcc] Catch erroneous negative builtin numbers
Setting a builtin number negative makes it a non-builtin function, but
possibly in the middle of another function. Not good.
2020-03-02 13:47:46 +09:00
Bill Currie
0db617719e [qfcc] Improve error messages for bad qc builtins
While global quakec functions could not be initialized to another
function, the error messages were rather obscure.
2020-03-02 13:47:46 +09:00
Bill Currie
9ccff74fcf [qfcc] Emit only one instance per protocol per module
This is actually a double issue: when a class implementing a protocol
used the protocol in @protocol(), not only would the protocol get
emitted as part of the class data specifying that the class conforms to
the protocol, a second instance would be emitted again when @protocol()
was used. On top of that, only the instance referenced by @protocol()
would be initialized. Now, both class emission and @protocol() get their
protocol def from the same place and thus only one, properly
initialized, protocol instance is emitted.
2020-03-02 10:55:46 +09:00
Bill Currie
8021613b79 [qfcc] Fix missing protocol method lists
The problem was an erroneous assumption that the methods had to be
defined. Any class implementing a protocol must implement (and thus
define) the methods, but a protocol declaration cannot: it merely
declares the methods, and it's entirely possible for a module to see
only the protocol definition and not any classes implementing the
protocol.
2020-03-02 10:52:09 +09:00
Bill Currie
b6b7f9675f [qfcc] Emit static instance lists
For now, only protocols are in the list (gcc adds only static string
objects and qfcc doesn't do those yet, so not so far behind). qfprogs
dumps them.
2020-03-02 10:48:51 +09:00
Bill Currie
544d7de1ec [qfcc] Implement @protocol(foo)
Unlike gcc, qfcc requires foo to be defined, not just declared (I
suspect this is a bug in gcc, or even the ObjC spec), because allowing
forward declarations causes an empty (no methods) protocol to be
emitted, and then when the protocol is actually defined, one with
methods, resulting in two different versions of the same protocol, which
comments in the gnu objc runtime specifically state is a problem but is
not checked because it "never happens in practice" (found while
investigating gcc's behavior with @protocol and just what some of the
comments about static instance lists meant).
2020-03-02 10:42:26 +09:00
Bill Currie
254bf29bd4 [qfcc] Handle protocol forward declarations 2020-03-01 19:37:40 +09:00
Bill Currie
80d9401eee [qfcc] Report errors for objects in function decls
The number of time's I've forgotten the * in a declaration in objective
code (probably thanks to C#'s lack of them).
2020-03-01 17:44:13 +09:00
Bill Currie
b544321609 [qfcc] Catch deferences to incomplete types
Reporting an error is so much more helpful than segmentation fault.
2020-03-01 17:43:28 +09:00
Bill Currie
277c64a460 [qfcc] Correct a typo 2020-03-01 17:28:51 +09:00
Bill Currie
caa297b756 [qfcc] Remove type alias encoding
It proved to be too fragile in its current implementation. It broke
pointers to incomplete structs and switch enum checking, and getting it
to work for other things was overly invasive. I still want the encoding,
but need to come up with something more robust.a
2020-03-01 16:13:18 +09:00
Bill Currie
1033716b2b [qfcc] Fix some curly space 2020-03-01 13:53:18 +09:00
Bill Currie
df2ed4b086 [qwaq] Move from tools to ruamoko
This fixes the dependency issues between qwaq and ruamoko. qwaq is
actually older than ruamoko. That little language feature test has come
a long way.

However, I'm considering moving to non-recursive make, but...
2020-03-01 00:55:15 +09:00
Bill Currie
c079eb851b [qwaq] Start work on the actual app
It doesn't look good, but it does have panel based windows working, and
using objects. Won't build reliably right now due to qwaq being in tools
and thus building before ruamoko, but I'll fix that next.
2020-03-01 00:40:55 +09:00
Bill Currie
271d836cd2 [qfcc] Catch static class instances in structs 2020-02-29 21:09:24 +09:00
Bill Currie
e93ca9d828 [qfcc] Fix infinite loop in linker 2020-02-29 20:13:25 +09:00
Bill Currie
8b6d05a4dd [qwaq] Ensure mouse motion reporting gets turned off
It seems that xterm automatically disables it when ncurses shuts down and
mate-terminal does not, or maybe a different version of something. Still,
good to clean up properly.
2020-02-29 16:36:23 +09:00
Bill Currie
ae532870c4 [qwaq] Implement basic color support 2020-02-29 14:48:18 +09:00
Bill Currie
ec4e9b326d [qwaq] Don't call wrefresh in cmd_mvwaddstr
There is now an implementation for wrefresh.
2020-02-29 14:43:08 +09:00
Bill Currie
f5f50ae231 [qwaq] Make stdscr available to progs 2020-02-29 14:38:54 +09:00
Bill Currie
5e4677f8d5 [qwaq] Implement the immediately useful panel functions 2020-02-29 13:06:58 +09:00
Bill Currie
17005637ca [qwaq] Rename the internal function names
Now they reflect the curses functions they wrap. The externally visible
builtin names are not changed because the parameters are in x, y order
rather than curses' y, x order.
2020-02-29 12:52:13 +09:00
Bill Currie
ea69921e6a [qwaq] Validate window before acquiring string
If the window is invalid and recovery is done, string ids will leak if
acquired before validation.

Afterwards, make the rest of the builtin wrappers consistent: extract
parameters, validate, [acquire resources], generate command.
2020-02-29 12:33:45 +09:00
Bill Currie
0119660b01 [qwaq] Convert remaining functions to command queue
Now that the initial prototype seems to be working well, it's time to
implement more commands. I might have to do some wrappers for actual
command writing (and result reading) as it looks like there will be a
lot of nearly identical code.
2020-02-29 11:44:43 +09:00
Bill Currie
513c808875 [qwaq] Make some bad ascii art 2020-02-29 02:07:47 +09:00
Bill Currie
bd98d1d9fb [qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.

The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.

Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.

Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.

Builtin functions write commands, acquire string ids, and read results.

The command processor reads commands, releases string ids, and writes
results.

Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-29 01:45:33 +09:00
Bill Currie
644ef93dde [qwaq] Create some ring-buffer macros
I expect I will need several messaging buffers, and ring buffers tend to
be quite robust. Replacing the event buffer code with the macros made
testing easy.
2020-02-28 22:27:29 +09:00
Bill Currie
6a58dcdddd [qwaq] Fix lost output
Turns out all I needed was a refresh() after initialization.
2020-02-27 21:38:55 +09:00
Bill Currie
dd25bf5dfe [qwaq] Read mouse movements
Many thanks to https://gist.github.com/sylt/93d3f7b77e7f3a881603 for the
necessary escape sequence to get xterm reporting mouse movement events.
2020-02-27 21:22:10 +09:00
Bill Currie
a3ed5926b9 [qwaq] Remove unnecessary fields from mouse events
id and z seem to always be 0.

Ironically, it turns out that the work needed for "int id" and "large"
struct nil init wasn't strictly necessary to get to this point, but
without having done that work, I wouldn't know :)
2020-02-27 21:08:12 +09:00
Bill Currie
08bf8a04e4 [qwaq] Implement an event queue
It seems to have an issue with a bogus clearing of the screen, but the
basics seem to be working.
2020-02-27 21:07:56 +09:00
Bill Currie
b4aebc120e [qfcc] Treat { } as nil for initializing compound types 2020-02-27 20:30:39 +09:00
Bill Currie
7c9072aebf [qfcc] Create struct fields for "type typename"
Such declarations were being lost, thus in the following, the id field
never got added:
typedef struct qwaq_mevent_s {
    int         id;
    int         x, y, z;
    int         buttons;
} qwaq_mevent_t;
2020-02-27 17:50:11 +09:00
Bill Currie
dbbb8a1396 [qfcc] Fix syntax error for id as a field name
event.e.mouse.id produced a syntax error, which is contrary to
Objective-C.
2020-02-27 17:43:39 +09:00
Bill Currie
e8c357393f [qwaq] Clear qwaq's print buffer
Didn't realized PR_Sprintf appended. Or, more likely, I had forgotten
because I imagine Deek and I discussed it at the time.
2020-02-27 02:11:54 +09:00
Bill Currie
edde4bad15 Create a basic hello world
And it has begun. It has some problems, but worse, it seems I broke
qfprogs and maybe pr_debug.c.
2020-02-27 01:18:38 +09:00
Bill Currie
126f8502bd Start working on a qwaq console tool
The intention is it will hopefully become a debugger. It will certainly
help with development of the progs engine.
2020-02-26 22:10:59 +09:00
Bill Currie
4cec3bbff6 Unalias types when checking cast-compatibility
This fixes the problem with passing typedefs to function parameters.
2020-02-26 17:49:09 +09:00
Bill Currie
69b5029de5 Throw away function parameter type alias info
typedef is meant to create a simple renaming of a potentially complex
type, not create a new type. Keeping the parameter type alias info makes
the types effectively different when it comes to overloaded function
resolution, which is quite contrary to the goal. Does expose some
breakage elsewhere, though.
2020-02-26 17:46:53 +09:00
Bill Currie
9528c1176e Rename cast_expr's type vars for better clarity 2020-02-26 17:45:08 +09:00
Bill Currie
5c36c60005 Use type check helpers some more 2020-02-26 17:41:45 +09:00
Bill Currie
5d302ff6f4 Fix incorrect usage of signed verbosity 2020-02-26 17:15:52 +09:00
Bill Currie
35c9d6ee38 Make pr_obcode.c mostly thread safe
Its public data is all read-only, and once set up, its private data is
too (just don't call init in multiple threads).
2020-02-26 01:20:28 +09:00
Bill Currie
66dd3ef070 Make a bunch of count things positive-only
This fixes a pile of FIXMEs, because some things should never be
negative.
2020-02-25 21:23:13 +09:00
Bill Currie
282132958f Relocate local def type encodings in debug load
For technical reasons (programmer laziness), qfcc does not fix up local
def type encodings when writing the debug symbols file (type encoding
location not readily accessible).
2020-02-25 20:46:01 +09:00
Bill Currie
89e83d7d73 Move the debug info out of progs_t
The debug subsystem now uses the resources system to ensure it cleans
up, and its data is now semi-private. Unfortunately, PR_LoadDebug had to
remain public for qfprogs because using PR_RunLoadFuncs would cause
builtin resolution to complain.
2020-02-25 20:07:29 +09:00
Bill Currie
ca6fe0730b Fix qfcc test harness tracing
Just a consequence of progs execution state being initialized properly.
2020-02-25 19:02:24 +09:00
Bill Currie
a55b9544ac Improve handling of pr_argc
It is now set to 0 when progs are loaded and every time
PR_ExecuteProgram() returns. This takes care of the default case, but
when setting parameters, pr_argc needs to be set correctly in case a
vararg function is called.
2020-02-25 17:36:29 +09:00
Bill Currie
256dee98a1 Make progs string resources management private
Strangely enough, using the progs resources system. This is a step
towards having progs that can be reset properly, or even dynamically
created VMs.
2020-02-25 00:23:08 +09:00
Bill Currie
1cfac0f11a Resolve local def type encodings
They need to be resolved at load-time.
2020-02-25 00:12:02 +09:00
Bill Currie
c51c9edd9d Fix incorrect encoding of local defs 2020-02-25 00:11:01 +09:00
Bill Currie
7406e0308e Fix some warnings picked up in an optimized build 2020-02-24 11:28:43 +09:00
Bill Currie
c43b9681eb Keep structure members aligned 2020-02-24 08:43:32 +09:00
Bill Currie
2adcad7c84 Allow non-short-circuited logic to work 2020-02-24 02:25:28 +09:00
Bill Currie
ac32bbca40 Improve code for short-circuited float logic 2020-02-24 02:14:44 +09:00
Bill Currie
9c26d12f95 Cast rather than alias for testing constants
Fixes ICE in do { ... } while (1);
2020-02-24 02:13:23 +09:00
Bill Currie
55e53211e2 Generate default type expressions for folded booleans 2020-02-24 02:11:31 +09:00
Bill Currie
d6752c254c Move short-circuit boolean code to its own file 2020-02-24 01:20:24 +09:00
Bill Currie
0bf7ec07b7 Make debug output verbosity 2
and internal diagnostic sources level 1.
2020-02-24 00:22:13 +09:00
Bill Currie
11365024d2 Fix writing of frames files when not requested
I forgot to check for the option for separate compilation.
2020-02-24 00:07:48 +09:00
Bill Currie
27ae5ccfce Fix ICE after incomplete type error
Attempting to define a variable with an incomplete type is an error, and
results in a default size 1 of allocated, but I forgot to set default
alignment when implementing alignment.
2020-02-24 00:07:39 +09:00
Bill Currie
f387b9aa47 Propagate implicit for negating double constants 2020-02-23 23:41:12 +09:00
Bill Currie
5374798ef9 Fix order of operations for implicit casts 2020-02-23 23:18:31 +09:00
Bill Currie
05f6ddbb13 Print promoted warnings as errors
This makes it much easier to see why a compilation failed when only
warnings are visible.
2020-02-23 23:10:56 +09:00
Bill Currie
526c27cf03 Handle implicit casts for double/float comparisons 2020-02-23 23:10:10 +09:00
Bill Currie
607fd2e30e Allow constant initialized globals in advanced code
Use -C const-initializers to enable (or no-const-initializers to disable
in traditional/extended code).
2020-02-23 22:51:00 +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
2a39208069 Set void alignment to 1
qcc allowed void variables.
2020-02-23 20:48:43 +09:00
Bill Currie
c9fca9c98a Fix another inside-out type utility function 2020-02-23 20:48:12 +09:00
Bill Currie
4b7ecdf74a Make PR_Init take an instance to initialize
This allows internal sub-systems to do per-instance initializations
without other engine systems having to know about them.
2020-02-23 18:32:16 +09:00
Bill Currie
6009d1d023 Fix qfo strings dumping 2020-02-23 15:08:31 +09:00
Bill Currie
b0157e5095 Fix qfo field dumping 2020-02-23 14:56:50 +09:00
Bill Currie
81293d98dd Fix qfo line info dumping
The addition of xdef data has made qfo_to_progs unusable in qfprogs,
resulting in various invalid memory accesses. It always was an ugly hack
anyway, so this is the first step to proper qfo support in qfprogs.
2020-02-23 14:44:25 +09:00
Bill Currie
155a633ebe Include extended defs data in the size report 2020-02-23 11:53:57 +09:00
Bill Currie
6c6433dea5 Fetch the def name only once when scanning
Not that speed is critical at this point, but it feels better.
2020-02-23 11:52:35 +09:00
Bill Currie
52d54f98bf Fix some issues in the typedef test
It wasn't being strict enough in the test (but was good enough to catch
the relocation error, at least) and was printing the alias name
incorrectly.
2020-02-22 23:41:09 +09:00
Bill Currie
3aabfa71d9 Find lost type encoding relocations
I have no idea why I thought it was a good idea to delete those lines.
Yay for regression tests, though.
2020-02-22 23:33:56 +09:00
Bill Currie
806af85447 Remove reference to ddef_t from progs.h
This cleans up some horrible names and redundant fields that were a
result of the transition to pr_def_t
2020-02-22 22:44:08 +09:00
Bill Currie
81083698a8 Move to using an in-memory form of ddef_t
This allows the VM to work with extended ddefs transparently. It seems
to have uncovered a typedef alias relocation bug, though.
2020-02-22 22:33:44 +09:00
Bill Currie
4df926e531 Write extended ddef information to progs far data
I was originally going to put it in the debug syms file, but I realized
that the data persistence code would need access to both def type and
certainly correct def offsets for defs in far data.
2020-02-22 14:11:15 +09:00
Bill Currie
e7b4eedc07 Fix segfault in dereferencing undefined field containers 2020-02-22 14:04:10 +09:00
Bill Currie
c296514b95 Make pr.load_file 'return' the file size 2020-02-21 21:17:28 +09:00
Bill Currie
7e76a96f7d Fix a missed ty_none 2020-02-21 21:13:18 +09:00
Bill Currie
fe796eee68 Move the meta type enum ino pr_type.h 2020-02-21 17:58:19 +09:00
Bill Currie
8b225dbfc1 Ensure .ctor functions do not reset tracing 2020-02-21 17:53:27 +09:00
Bill Currie
caf78b5422 Rename ty_none to ty_basic
This far better reflects the actual meaning. It is very likely that
ty_none is a holdover from long before there was full type encoding and
it meant that the union in qfcc's type_t had no data. This is still
true for basic types, but only if not a function, field or pointer type.
If the type was function, field or pointer, it was not true, so it was
misnamed pretty much from the start.
2020-02-21 17:52:00 +09:00
Bill Currie
1b43046c8a Handle aliased types when building function calls 2020-02-19 21:41:46 +09:00
Bill Currie
fd2b7ee6f9 Use more type checking helper functions 2020-02-19 21:41:46 +09:00
Bill Currie
a6003ed08a Walk qfo alias chain for type size and alignment
While the basic type is stored in the alias type record, it's no good
for size or alignment as it will give incorrect results for complex
types.
2020-02-19 21:41:46 +09:00
Bill Currie
a0914e1ec8 Fix the typedef test case to actually work 2020-02-19 21:41:46 +09:00
Bill Currie
6a70d2e362 Give alias types a unique encoding
The encoding is used as the def name and it needs to be different than
the alias target or the linker throws it away as an external def.
2020-02-19 21:41:46 +09:00
Bill Currie
6bc803c72d Use correct encoding for alias types
I got confused which field was which.
2020-02-19 21:41:46 +09:00
Bill Currie
6bcc2c49ab Use helper functions for type checks
They hide the evil details of aliased types. More to come :/
2020-02-19 21:41:46 +09:00
Bill Currie
9610788dea Fix some more type aliasing issues
Getting there... (I knew this would be a big job)
2020-02-19 21:41:46 +09:00
Bill Currie
d50a27a045 Race down the alias chain before checking types
This takes care of some of the type aliasing issues.
2020-02-19 21:41:46 +09:00
Bill Currie
a5aba6c8ac Implement type aliasing
The separate types are in the file, but there are multiple issues
2020-02-19 21:41:46 +09:00
Bill Currie
2f18364364 Start work on encoding typedef chains 2020-02-19 21:41:46 +09:00
Bill Currie
adb7f5d601 Quieten the test script build rules 2020-02-19 21:41:46 +09:00
Bill Currie
b00c866c4e Allow casting between string and pointer types 2020-02-19 21:41:46 +09:00
Bill Currie
7a315b4a89 Fix storage class for for-loop declarations
Getting "i redeclared" when i was declared in a for loop in two
different functions was a tad unexpected.
2020-02-19 21:41:46 +09:00
Bill Currie
67e183c8b6 Put the guts of qwaq's reflection code into ruamoko 2020-02-19 21:41:46 +09:00
Bill Currie
4c40928112 Remove what appears to be a redundant check
It was long wrong anyway as it checked past the end of the function's
parameters, which caused a segfault when calling varargs functions with
no formal parameters.
2020-02-19 02:53:38 +09:00
Bill Currie
a65d6bce09 Fix a warning that got through
I forgot to compile test in optimized...
2020-02-19 02:43:27 +09:00
Bill Currie
bd6dcafdc8 Replace system defines/includes with qfcc's
Right now, it probably works only with modern gcc.
2020-02-19 02:35:09 +09:00
Bill Currie
2d52da9c0d Fix segfault in unlimited params 2020-02-19 02:35:09 +09:00
Bill Currie
c61d0b6ff0 Allow unlimited parameters in function declarations
However, definitions are still limited to 8 parameters. This allows
processing of C headers for type information.
2020-02-19 02:35:09 +09:00
Bill Currie
ee228504aa Fix self-referenced enum declarations
eg:
typedef enum foo {
    bar = 1,
    baz = bar,
} foo;
2020-02-19 02:35:09 +09:00
Bill Currie
d4574111b5 Replace system defines/includes with qfcc's
Right now, it probably works only with modern gcc.
2020-02-19 02:31:16 +09:00
Bill Currie
2f726a497b Fix segfault in unlimited params 2020-02-19 02:30:50 +09:00
Bill Currie
501174e14f Allow unlimited parameters in function declarations
However, definitions are still limited to 8 parameters. This allows
processing of C headers for type information.
2020-02-19 01:51:24 +09:00
Bill Currie
e658c0d5cd Fix self-referenced enum declarations
eg:
typedef enum foo {
    bar = 1,
    baz = bar,
} foo;
2020-02-19 01:28:09 +09:00
Bill Currie
9ff4eefe65 Merge branch 'master' into vulkan 2020-02-16 18:17:50 +09:00
Bill Currie
7a399c956b Encode function parameter alignment
The encoding is 3:5 giving 3 bits for alignment (log2) and 5 bits for
size, with alignment in the 3 most significant bits. This keeps the
format backwards compatible as until doubles were added, all types were
aligned to 1 word which gets encoded as 0, and the size is unaffected.
2020-02-16 17:10:43 +09:00
Bill Currie
1bc08c59f6 Add tests for %%
double fails due to qfcc aligning double param locals, but the engine
not doing so.
2020-02-16 17:02:38 +09:00
Bill Currie
1a9510834a Add a missed opcode conversion for %% 2020-02-16 12:10:09 +09:00
Bill Currie
9d2d33fa50 Implement %% (true modulo) support in qfcc
However, it's not quite working yet
2020-02-16 11:57:58 +09:00
Bill Currie
4269c8cb07 Rename the mod instruction to rem
Because % really implements remainder rather than true modulo, and I
plan on adding %% to implement true modulo.
2020-02-16 11:04:30 +09:00
Bill Currie
db9996023f Add some tests for double comparison
More testing the engine than the compiler, but hey :)
2020-02-15 23:49:12 +09:00
Bill Currie
14acfad7c4 Fix incorrect placement of far data
All the care in aligning things was undone by not updating the
calculations of the pointers.
2020-02-15 23:49:12 +09:00
Bill Currie
1985b6d4fd Avoid creating a struct temp for ivar struct return
This fixed the uninitialized temp warning in HUD.r. The problem was
caused by the flow analyzer not being able to detect that the struct
temp was being initialized by the move statement due to the address of
the temp being in a pointer temp. While it would be good to use a
constant pointer for the address of the struct temp or improving the
flow analyzer to track actual data, avoiding the temp in the first place
results in nicer code as it removes a move statement.
2020-02-15 23:49:12 +09:00
Bill Currie
9c996df7b4 Add a test case for the uninit temp in HUD.r 2020-02-15 23:49:12 +09:00
Bill Currie
7bfa0f7a92 Allow pragmas to have arguments
It does mean only one pragma per line, but that's not such a big deal.
2020-02-15 23:49:12 +09:00
Bill Currie
91f5023681 Promote bugs to internal errors
Mostly so I can catch them in test cases
2020-02-15 23:49:12 +09:00
Bill Currie
344d429134 Test array initializer double demotions
Turns out array inits are very strict about types (bug?).
2020-02-15 23:49:12 +09:00
Bill Currie
6ce99afa5b Catch double demotion in global initializers
Local initializers are handled by regular assignments
2020-02-15 23:49:12 +09:00
Bill Currie
c5ce18591f Catch and warn demotion of double in assignments 2020-02-15 23:49:12 +09:00
Bill Currie
08ca59d0df Add tests for double demotion 2020-02-15 23:49:12 +09:00
Bill Currie
4bf37b274b Ensure double is not in zero or param structs for v6 2020-02-15 23:49:12 +09:00
Bill Currie
be30a0eb19 Fix missing alignment init on zero and param types 2020-02-15 23:49:12 +09:00
Bill Currie
3e651b43f8 Handle aliased values when emitting statements
With this, cast address initializers work. I have to wonder if the alias
value short-circuit was legacy from long before the rewrite, as it was
quite trivial to handle in the back-end.
2020-02-15 23:49:12 +09:00
Bill Currie
e4eb793fb3 Treat aliased values as constant
One step closer to cast address initializers working.
2020-02-15 23:49:12 +09:00
Bill Currie
ce9902baed Don't short-circuit aliased values
Not sure why I thought it was a good idea as it turns out this is why
cast pointer initializers were being lost.
2020-02-15 23:49:12 +09:00
Bill Currie
3257e7145b Add failing global init test too 2020-02-15 23:49:12 +09:00
Bill Currie
4caa875442 Finish up alignment tests and add address cast
It turns out that initializing a local int with a pointer cast doesn't
work.
2020-02-15 23:49:12 +09:00
Bill Currie
a4a57b6ffd Implement aligned allocations 2020-02-15 23:49:12 +09:00
Bill Currie
293f10211a Start on alignment test
Currently fails (deliberately, WIP)
2020-02-15 23:49:12 +09:00
Bill Currie
0542daacdf Create more double related tests
Including catching warnings :) (yay -Werror)
2020-02-15 23:49:12 +09:00
Bill Currie
7e09a94469 Fix "casts" between signed and unsigned int 2020-02-15 23:49:12 +09:00
Bill Currie
5d8d805b60 Fix test for single overload functions
All functions are stored in the overload functions table, even those
that are never explicitly overloaded, but only explicitly overloaded
functions (those with @overload) use the type-qualified naming.
2020-02-15 23:49:12 +09:00
Bill Currie
533fb8acc9 Implement double constants 2020-02-15 23:49:12 +09:00
Bill Currie
2cd62fe01b Fix several double-related bug
float is promoted to double through ... for non-v6 code.
PR_Sprintf has custom param access via P_*, messed up doubles.
2020-02-15 23:49:12 +09:00
Bill Currie
eb7f825158 Test for full-float % 2020-02-15 23:49:12 +09:00
Bill Currie
8920c59515 Find @override functions even when there's only one 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
13b608f40c Don't truncat float % float
This allows full usage, eg, x % pi, but otherwise maintains
compatibility with integer %
2020-02-15 23:49:12 +09:00
Bill Currie
16f8dca72e Align local and far data spaces
I plan on adding doubles, and so it's necessary to ensure that attempts
to align doubles in local or far data spaces remain aligned after final
linking.
2020-02-15 23:49:12 +09:00
Bill Currie
197f856a30 Fix incorrect scalar/quaternion division
It's just not possible.
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
fbd79963bb Update for doxygen 1.8.16 2020-02-11 15:20:49 +09:00
Bill Currie
9d09d65d9a Clean up some export stuff
While it's not there yet, the eventual goal is to support multiple
models in the one blend file, so per-object settings is a requirement.
2019-08-20 16:52:43 +09:00
Bill Currie
c14e5623ad Get the mdl frames script property working
Maybe late 2.78+, blender added the ability to use any ID type in
PointerProperty, which is just what I wanted for the frames script.
2019-08-16 22:34:45 +09:00
Bill Currie
839d90981d Clean up a few last things for blender 2.80
Many many thanks to Aleksander Marhall for the initial work.
2019-08-16 22:32:37 +09:00
khreathor
008b5a4d2c Import/Export fixes after some Blender 2.8 API changes 2019-08-16 21:38:29 +09:00
khreathor
11e5f39fdc Fix for the export error when there is no Shape Keys available 2019-08-16 21:38:29 +09:00
khreathor
36da80c0d0 Export proper frame names 2019-08-16 21:38:29 +09:00
khreathor
33d114c09e Set playback/animation range to start from frame 1 2019-08-16 21:38:29 +09:00
khreathor
ff5f9f1831 Add "empty" skin during export for models with no materials or texture nodes 2019-08-16 21:38:29 +09:00
khreathor
3913febace MDL properties in object panel are back 2019-08-16 21:38:29 +09:00
khreathor
31fa7a81ef Fix for single skin being marked as skingroup 2019-08-16 21:38:29 +09:00
khreathor
94c3c8c2cb Skingroup image export order based on texture node position (height) in shader editor. Nodes with higher position are exported first. 2019-08-16 21:38:29 +09:00
khreathor
4f29f57e77 Proper node positioning after import 2019-08-16 21:38:29 +09:00
khreathor
a13c382969 Skingroup images import order fix 2019-08-16 21:38:29 +09:00
khreathor
4d1f05186b Skingroups export added 2019-08-16 21:38:29 +09:00
khreathor
17e76149a1 Adjust playback range on import, to fit mdl's animation length 2019-08-16 21:38:29 +09:00
khreathor
66fe862a87 Import skingroups as separate materials with skins as textures 2019-08-16 21:38:29 +09:00
khreathor
ae86790e6c Initial Blender 2.8 changes - it works, now it's time for improvements 2019-08-16 21:38:29 +09:00
khreathor
8112c4e8b6 Moved MDL settings from Object tab to export options/presets 2019-08-16 21:38:29 +09:00
khreathor
90a707f7f9 Export animation range selected with start/end playback range in Timeline Editor 2019-08-16 21:38:29 +09:00
Bill Currie
4e4d1b99b4 Clean up all the system shutdown calls
I added Sys_RegisterShutdown years ago and never really did anything
with it: now any system that needs to be shutdown can ensure it gets
shutdown on program exit, and in the correct order (ie, reverse to init
order).
2019-07-12 23:15:26 +09:00
Bill Currie
c3fa78ef4d Include test for 2d vector expressions 2019-07-06 14:49:28 +09:00
Bill Currie
8caf2eb584 Mark some new functions as pure 2019-06-27 21:37:48 +09:00
Bill Currie
a5ee58cebb Support 2d vector expressions
[x, y] expands to [x, y, 0] (for now, might add a 2d vector type).
2019-06-18 11:54:45 +09:00
Bill Currie
83fac13a0c Fix debug line numbers for vector expressions 2019-06-18 11:53:58 +09:00
Bill Currie
b37c331e76 Catch taking size of null type
This should help catch similar errors in the future.
2019-06-18 10:39:17 +09:00
Bill Currie
0f1f477e64 Set up temp aliases correctly
Fixes vector expressions as sub-expresses. I really don't know why I did
the temp alias setup that way.
2019-06-18 10:38:19 +09:00
Bill Currie
fc50376297 Fix a minor error check mistake 2019-06-18 08:54:18 +09:00
Bill Currie
fe73547f43 Update alias type sameness check
This one seems to be fairly robust. Fixes alias being used to cast
pointers (maybe a better way, but this works for now).
2019-06-18 08:53:05 +09:00
Bill Currie
f7825fe7cf Print types properly in pointer value expressions 2019-06-18 00:22:24 +09:00
Bill Currie
b996fb7aa4 Make operand->type actual type instead of low-level
And clean up the resulting mess. This fixes struct copy, but uncovers
another bug :/
2019-06-17 23:38:34 +09:00
Bill Currie
e0c8285f07 Extend nested struct test to cover struct copy
Fails :P
2019-06-17 22:57:40 +09:00
Bill Currie
dd52b7fea1 Merge aliased alias expressions
This comes up when accessing struct fields nested in another struct.
Fixes the nested struct fields test.
2019-06-17 22:48:42 +09:00
Bill Currie
e9c24dbf1c Test case for accessing nested struct fields
Currently fails.
2019-06-17 22:47:44 +09:00
Bill Currie
ec128ffeee Leave a FIXME for daglabel_t.live 2019-06-16 19:24:19 +09:00
Bill Currie
d6d3027411 Mark the correct operand as live
This fixes vecexpr (and possibly other cases).
2019-06-16 19:21:02 +09:00
Bill Currie
6e21c3ae2e Treat func statements similarly to flow statements
func statements need their operands marked live like flow statements do
because usage is more indirect.
2019-06-16 19:20:21 +09:00
Bill Currie
db4a7a139e Use the alias code when making vars live
Not sure the live forcing flag is needed anymore (need to test).
2019-06-16 19:17:45 +09:00
Bill Currie
2977c145d0 Clean up dag live alias code a little
Mainly, this makes it possible to reuse the alias code.
2019-06-16 19:17:01 +09:00
Bill Currie
82b334e919 Number dot dumps to help identify order 2019-06-16 19:12:18 +09:00
Bill Currie
c40f4194e9 Use tempop_visit_all for flow and dags
Fixes t3 of vecexpr, but t2 is broken (lost first assignment).
2019-06-16 16:56:39 +09:00
Bill Currie
3c4903245a Fix some curly space 2019-06-16 16:55:54 +09:00
Bill Currie
bc271d8a02 Add tempop_visit_all
Works the same as def_visit_all, but for temp operands.
2019-06-16 16:52:49 +09:00
Bill Currie
fa69aeef0f Improve handling of temp aliases
This makes all tests pass when not optimizing. More work needs to be
done in dags.
2019-06-12 00:37:02 +09:00
Bill Currie
b18a744288 Use offset alias expressions
They are not quite working yet as the operand generator does not use the
offset yet.
2019-06-10 23:55:16 +09:00
Bill Currie
cc27949a34 Ensure pointer values always have a type
The dags generator was creating a pointer value with no type which
caused print_statement to segfault.
2019-06-10 23:52:39 +09:00
Bill Currie
ee1f5f9478 Add support for binary alias expressions
Doesn't quite work yet.
2019-06-10 23:48:58 +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
08ab42fc15 Handle vector expressions as sub-expressions
Now my little game builds again :)
2019-06-10 15:50:35 +09:00
Bill Currie
49ed4310fd Fix assigning int to enum or enum to int
Or float, for v6 progs.
2019-06-10 08:46:40 +09:00
Bill Currie
83fb588727 Support vector/quaternion division by float
Implemented via v*(1/f) or q*(1/f) to give CSE a chance to optimize the
division if necessary as otherwise the engine would have to divide every
time.
2019-06-10 08:44:36 +09:00
Bill Currie
7dc1a0640a Delay creating actual enum symbols
In order to keep enumerator type and enum type the same, the values need
to have their type set after the enum type is finalized, and then the
appropriate symbols created in the parent scope. This fixes the infinite
recursion when assigning an enum value to its own type.
2019-06-10 07:44:23 +09:00
Bill Currie
f81484a068 Test compiling enums
It turns out the enumerator type and enum type wind up with different
instances of the same type (due to the way type chaining works). This
results in infinite recursion in assign_expr and check_types_compatible.
2019-06-10 07:17:41 +09:00
Bill Currie
ef4ad52239 Make binary_expr fold constants
This is where constant folding should have happened all along. While
unary_expr should fold constants too, it seems to already try to do so
and it's a bit much of a mess to clean up right now.
2019-06-10 00:36:13 +09:00
Bill Currie
bf0543f7fb Be paranoid about temp var sizes
Prevents array index errors.
2019-06-10 00:19:48 +09:00
Bill Currie
28a2b96800 Implement automatic array sizing from initializer 2019-06-09 23:11:38 +09:00
Bill Currie
00f12263ca Fix casting arrays to pointers 2019-06-09 22:55:38 +09:00
Bill Currie
3196bcc851 Allow fold_constants to handle some math identities
Such as x*0 -> 0, x*1 -> x, x+0 ->x, etc.
2019-06-09 22:34:23 +09:00
Bill Currie
c98d1ff08c Document some problems with nil
While he's a pretty cool character in HZD, he seems to have some
identity problems when in a compiler.
2019-06-09 22:29:51 +09:00
Bill Currie
439cd15620 Do type promotion for short
fold_constants used to do this when it was overly aggressive. Fixes the
ICE when accessing an array in a struct via a pointer.
2019-06-09 22:27:53 +09:00
Bill Currie
227ac46ffe Clean up array expression processing
And make sure constants are folded since fold_constants is no longer
recursive.
2019-06-09 22:25:55 +09:00
Bill Currie
f70801fa52 Add a test for accessing an array in a struct
That's accessed via a pointer. Whee. However, at this stage, the problem
is really a promotion issue for short -> integer.
2019-06-09 21:44:58 +09:00
Bill Currie
e46a44d9c6 Update TODO 2019-06-09 21:37:46 +09:00
Bill Currie
6253623e9b Remove some weird dereference code
It appears to have been an attempt at optimizing dereferences, but it
instead just utterly mangled them.
2019-06-09 21:37:46 +09:00
Bill Currie
f49303e774 Emit code for address expressions
It helps if the necessary code is actually emitted in the first place.
2019-06-09 21:37:46 +09:00
Bill Currie
8cef85e5de Cast scalar types when necessary on assignment
This fixes type promotion errors that broke some tests.
2019-06-09 20:12:50 +09:00
Bill Currie
e849c2d1ce Mark block expr result as rvalue when used as one
At least for return. There may be other cases that need it, but this
fixes comma-expr.r (minus int->float promotion issues).
2019-06-09 19:29:21 +09:00
Bill Currie
d9c9686288 Make initialized globals non-constant
This is for modern code. Traditional code still treats initialized
globals as constant and nosave. This will make a bit of a mess of
modern code that expects traditional behavior.
2019-06-09 19:23:23 +09:00
Bill Currie
b7b6a89b91 Simplify fold_constants
While this does break automatic type promotion, it does stop
fold_constants recursing through complex expressions: only the top level
expression needs to be folded, and then only if both sides are actually
constant.
2019-06-09 19:20:35 +09:00
Bill Currie
2ee36e8b99 Rename qfot_type_t.ty to meta
When I did up a ruamoko implementation of a type encoding dumper, I
named the field meta, which feels much better than ty.
2019-06-09 18:10:07 +09:00
Bill Currie
f093516962 Move qfo type encoding structs
This makes them available to the gamecode VM, and thus the debugger.
2019-06-09 18:07:58 +09:00
Bill Currie
7fce68649a Implement comma expressions
Doesn't quite work (attempt to suppress warning for return a = 3, 5;
failed).
2019-06-09 16:56:20 +09:00
Bill Currie
689d1ad3ec Remove some debug prints 2019-06-09 16:45:01 +09:00
Bill Currie
33c2eb430f Stop bison complaining about %expect
And make sure warnings get fixed.
2019-06-09 16:19:27 +09:00
Bill Currie
1db600548e Fix for decl test scope issue 2019-06-09 13:55:07 +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
d29ea55826 Add a test for for loop declarations
I think the compiler segfaulting indicates a test failure.
2019-06-09 13:02:36 +09:00
Bill Currie
625e767684 Update qf dependency stuff for recent automake
Not sure just what version of automake broke things, but I do remember
having a bad time getting the dependencies to work in the first place.
At least now they should be more reliable (until automake changes
things).
2019-06-09 13:00:55 +09:00
Bill Currie
5bd3c8c985 Allow variable declarations in for loops
Matches C, C++ and C#
2019-06-08 21:52:17 +09:00
Bill Currie
be4c3a82a2 Detect redefinitions of structs and unions
While the redefinition was being detected, it was misreported as the tag
being wrong, and on the wrong line, too.
2019-06-08 19:25:25 +09:00
Bill Currie
f2102187b9 Clean up emit_protocol_list
Now it uses emit_structure, which will make it easier should things go
wrong.
2019-06-08 19:23:49 +09:00
Bill Currie
6acbdcb3e5 Correct a typo 2019-06-08 19:23:10 +09:00
Bill Currie
df0316bb13 Clean up some comment FIXMEs 2019-06-08 19:22:29 +09:00
Bill Currie
e217bdd55f Assign vector expressions to a temp for return
Rather than direct to .return, allowing return of vector expressions
with function calls without trashing the vector.
2019-06-08 13:36:03 +09:00
Bill Currie
ebab6574b9 Allow taking the address of a temporary variable 2019-06-08 13:35:47 +09:00
Bill Currie
e27da9c7db Avoid folding constants in assign_expr
This prevents fold_constants from complaining about attempts to take
the address of a vector.
2019-06-08 13:31:30 +09:00
Bill Currie
398e1cf83a Use output file as base for dot files
Ensures the output goes not go into the source directory when using a
separate build tree.
2019-06-08 13:30:06 +09:00
Bill Currie
3327127e36 Fix a typo in a comment 2019-06-08 13:28:29 +09:00
Bill Currie
4ef4a7e955 Start work on simple names in symbol tables
I don't remember what the goal was (stopped working on it eight months
ago), but some possibilities include:
 - better handling of nil (have trouble with assigning into struts)
 - automatic forward declarations ala C# and jai (I was watching vids
   about jai at the time)
 - something for pascal
 - simply that the default symbol type should not be var (in which case,
   goal accomplished)
2019-06-06 07:01:44 +09:00
Bill Currie
7e31704ebe Be more informative for pass by value size errors 2019-06-06 06:46:38 +09:00
Bill Currie
a5da8da1dc Be more informative for symbol type internal errors 2019-06-06 06:45:48 +09:00
Bill Currie
d00a2ef82d Convert constant vector expressions in binary expressions
Fixes not being able to compare with eg [1, 2, 3]
2019-06-06 06:44:19 +09:00
Bill Currie
319ecfbbfa Create a usable dot for vector expressions
It leaves a lot to be desired, but it beats "FIXME".
2019-06-06 06:42:31 +09:00
Bill Currie
607ec3124e More dead code removal.
I have no idea why this hung around. It appears to be old array/struct
initialization.
2018-10-15 22:12:40 +09:00
Bill Currie
ff5c1cd4c2 Clean up redundant type parameter to initialize_def. 2018-10-15 22:11:20 +09:00
Bill Currie
1746ce3af5 Make int type name reflect its keyword.
Makes qc error messages make more sense.
2018-10-15 20:54:05 +09:00
Bill Currie
302934a1e4 Remove some dead code. 2018-10-15 20:52:46 +09:00
Bill Currie
2a2754e581 More ways to break qfcc :/ 2018-10-15 19:48:19 +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
2f2edae43b Make error, warning and notice give compiler file/line too.
But only when verbosity > 1 (-vv).
2018-10-13 09:31:00 +09:00
Bill Currie
4828934e50 Fix a equality check typo.
Fixes bad code generation when assigning to vector.x in a function with no
parameters and the vector is the first local var.
2018-10-12 23:39:05 +09:00
Bill Currie
78e0a8dc52 Support assigning non-constant vector expressions. 2018-10-12 22:05:17 +09:00
Bill Currie
e03dfa29b4 Clean up the module .ctor construction a little. 2018-10-12 21:09:36 +09:00
Bill Currie
f56d25cda6 Don't double print messages. 2018-10-12 20:46:45 +09:00
Bill Currie
668896aa82 More diagnostic improvements. 2018-10-12 16:01:11 +09:00
Bill Currie
71b3d30aa1 Make the ice a little more informative. 2018-10-12 14:51:39 +09:00
Bill Currie
f58c2fef5a Switch QF's quaterions from wxyz to xyzw.
After messing with SIMD stuff for a little, I think I now understand why
the industry went with xyzw instead of the mathematical wxyz. Anyway, this
will make for less pain in the future (assuming I got everything).
2018-10-12 14:33:55 +09:00
Bill Currie
b7aa5bb8fe Fix an oops messing up edict size. 2018-10-12 14:33:26 +09:00
Bill Currie
f8606ebab8 Fix a object file segfault when spaces have no data.
ie, don't attempt to copy memory from a null pointer (just copy the null
pointer).
2018-10-12 14:00:34 +09:00
Bill Currie
3bd9f96b07 Make internal error messages a little more helpful.
They now include the file and line of the compiler as well.
2018-10-12 13:57:59 +09:00
Bill Currie
3656cb966c Fix some bison deprecation warnings. 2018-10-12 09:32:49 +09:00
Bill Currie
3bc664811e Fix lost error count tracking. 2018-10-11 22:03:14 +09:00
Bill Currie
a096babb1f Duplicate memory when creating a qfo from progs.
Fixes some double-free bugs when linking after compiling.
2018-10-11 21:37:01 +09:00
Bill Currie
f673ab9c3d Fix misreporting of failed progs load. 2018-10-11 13:39:48 +09:00
Bill Currie
82809eb856 Simplify the call to PR_LoadProgsFile.
I've decided that setting pr.max_edicts and pr.zone_size as part of the
local progs initialization rather than in PR_LoadProgsFile makes more
sense. For one, it is unlikely for the limits to change every time progs is
reloaded. Also, they seem to be a property of the VM rather than the progs.
However, there is nothing stopping the caller from updating max_edicts and
zone_size every call.
2018-10-11 10:06:48 +09:00
Bill Currie
673b45be05 Add diagnostic hooks. 2018-10-09 12:46:13 +09:00
Bill Currie
d95c01be1a More defspace tests. 2018-10-09 12:45:26 +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
05fd2d8cdd Start work on a unit test for defspace. 2018-09-09 22:37:09 +09:00
Bill Currie
3a4667318c Fix the qfcc test autodependencies. 2018-09-09 22:36:20 +09:00
Bill Currie
d1cb15664f Fix some spelling issues in a comment. 2018-09-09 22:34:24 +09:00
Bill Currie
71569b45c9 Pre-format diagnostic messages.
This will make it easier to hook diagnostics enabling unit tests.
2018-09-09 18:09:32 +09:00
Bill Currie
113e0d82ba Fix a signed comparison error.
Not sure how this fix got lost.
2018-09-09 16:48:19 +09:00
Bill Currie
aebd9288cd Force thread count to 1 when pthreads is unavailable.
Don't want the thread count being misreported.
2018-09-09 13:41:22 +09:00
Bill Currie
fa1514798b Print the number of threads used by qfvis. 2018-09-09 13:41:00 +09:00
Bill Currie
06ab36de3d Slight cleanup of winding allocation.
It seems gcc doesn't care if the & is present when calculating field
offsets, but it not being there bothered me very much and might as well use
our "standard" macro anyway.
2018-09-09 13:38:32 +09:00
Bill Currie
59e85b7d5e Fix a pile of dead assignments.
Some were actual bugs!
2018-09-08 22:23:57 +09:00
Bill Currie
59b04dbcca Make many qfo int fields unsigned.
I don't remember why I thought signed was a good idea, but unsigned does
make more sense for most fields.
2018-09-08 19:45:19 +09:00
Bill Currie
f75ff2d269 Fix some null argument issues. 2018-09-07 22:30:44 +09:00
Bill Currie
8f028b8a0d Fix some double frees. 2018-09-07 20:03:19 +09:00
Bill Currie
8fd5be0ee0 Fix a pile of sizeof goofs.
While scan-build wasn't what I was looking for, it has proven useful
anyway: many of the sizeof errors were just noise, but a few were actual
bugs (allocating too much or too little memory).
2018-09-07 20:00:57 +09:00
Bill Currie
b37b0180cb Actually do a test for triangle.r.
If the kahan triangle area method breaks, I did something wrong with qfcc's
handling of parentheses (ie, floating point math is not truly associative).
2018-08-23 20:52:32 +09:00
Bill Currie
1b9149ef31 Fix an argument passing error in test-harness.
It failed to pass the last argument to the ruamoko program being run.
2018-08-23 20:22:29 +09:00
Bill Currie
2fcda44ab0 Kill dag leaf nodes on assignment.
Fixes the failing swap test caused by a's original value being used (via t)
after being written.
2018-08-23 20:07:22 +09:00
Bill Currie
cb366dd825 Better flow dot dump "scripting".
Not sure I want to keep the statements in the live dump, but the system
is more flexible now.
2018-08-23 20:07:11 +09:00
Bill Currie
cdbdf3f0eb Make print_operand global. 2018-08-23 20:05:16 +09:00
Bill Currie
8b8b42bde2 Fix a typo in a comment. 2018-08-23 20:04:51 +09:00
Bill Currie
f250065003 Add tests for swapping vars and triangle area.
Triangle area was meant just to check Kahan's equation, but it found a
problem with swapping vars. swap.r currently fails.
2018-08-21 16:27:22 +09:00
Bill Currie
0f279cd3f0 Add a comment about fake statement numbers.
I had forgotten how they worked (not surprising after 6 years).
2018-08-21 15:57:51 +09:00
Bill Currie
1b84ea747c Dump statements during flow analysis. 2018-08-21 15:56:39 +09:00
Bill Currie
5ba13d759b Fix a FIXME.
Set of everything got added shortly after that FIXME was added, but I
forgot to fix it.
2018-08-21 15:56:03 +09:00
Bill Currie
fbdf560a7a Rename print_extra_live to print_flow_vars. 2018-08-21 15:55:11 +09:00
Bill Currie
5dbb7b6d4d Handle all modelgen commands.
Just in case someone ever adds models.qc to progs.src.
2018-08-20 00:11:02 +09:00
Bill Currie
027e76b4c9 Add a doc block to parse_cpp_line.
It took me too long to figure it out :P
2018-08-20 00:09:20 +09:00
Bill Currie
4f58429137 Fix an unhealthy pile of gcc 8 warnings.
While some of the warnings were merely annoying, some where actual bugs or
unearthed bugs in related code.
2018-08-20 00:05:00 +09:00
Bill Currie
81202d7b29 Add a shutdown builtin to qwaq. 2018-08-19 19:44:45 +09:00
Bill Currie
b795beb520 Add support for \? to qc strings.
And fix up the man page a bit.
2018-08-19 19:31:52 +09:00
Bill Currie
0de0eb2fc7 Fix a bunch of bit-rot. 2018-06-08 13:21:30 +09:00
Bill Currie
f522e58d53 Fix some blender warnings. 2018-06-08 12:45:57 +09:00
Bill Currie
2329fb1885 Fix some warnings and bitrot. 2016-10-25 00:10:30 +09:00
Bill Currie
932647bad3 Fix a segfault with switch on an undefined symbol.
Forgot to check if the test expression was not an error.
2016-01-10 13:41:49 +09:00
Bill Currie
bf40f0126e Convert vector expressions when passing parameters.
Calling a function with [vector stuff] caused an ICE.
2016-01-08 21:16:37 +09:00
Bill Currie
1061256c4f Add a missing expression type to dot_expr. 2016-01-08 21:15:47 +09:00
Bill Currie
431074d58f Update label destination when moving labels.
This fixes a segfault when optimizing the empty-body test. The label was
getting moved, but the statement block to which it pointed was not updated
and thus it pointed to dead data.
2016-01-07 21:24:29 +09:00
Bill Currie
d54ee6c8c3 Do not promote debug messages to warnings.
I think I copied the notice code for debug and forgot to edit the
promotion. Oops.
2016-01-07 20:08:07 +09:00
Bill Currie
6e65de251c Put qwaq's epoch back to 0.
4Gs causes a few problems at this stage. I really need to look into putting
long and double into qc.
2016-01-04 20:42:57 +09:00
Bill Currie
735fcf68d5 Clean up usage of va_copy.
AC_TYPE_VA_LIST is no longer necessary, and the code is easier to read.
2016-01-03 21:16:23 +09:00
Bill Currie
a54f3d9035 Shutdown some subsystems on exit.
This fixes the problem with X keyboard repeat not being restored.
2016-01-03 17:39:03 +09:00
Bill Currie
c71eccfb10 Remove MAX_THREADS.
This fixes a buffer overflow with more than 4 threads.
2015-08-14 10:57:51 +09:00
Bill Currie
2cd59c962c Rename qfcc's basename to file_basename.
Avoids naming conflicts with JohnnyonFlame's toolchain.
2014-01-31 12:22:11 +09:00
Bill Currie
3efb0c538f Separate file search from loading.
QFS_LoadFile (and its wrappers) now  take a file handle rather than a
path. This will make vpath usage a little cleaner to implement.
2014-01-28 16:22:05 +09:00
Bill Currie
6c0f271783 Fix some more automake warnings. 2013-11-24 13:26:12 +09:00
Bill Currie
f5501fbf24 Fix a pile of automake deprecation warnings.
s/INCLUDES/AM_CPPFLAGS/g

I <3 sed :)
2013-11-24 13:11:50 +09:00
Bill Currie
6996e7295a Add a getLine method to Script.
It returns the rest of the line (minus // style comments) as the token. I
needed it in another project but this is my central repository for
script.py.
2013-11-24 11:21:40 +09:00
Bill Currie
eeaf2bc43f Return None instead of False from parse_entity.
Don't remember how I found that one, but None makes much more sense.
2013-11-24 11:19:50 +09:00
Bill Currie
c88d1987a1 Add warnings for empty blocks in if/else/do.
Saw a discussion of such in #qc and that gcc implemented it. I realized it
would be pretty easy to detect and very useful (I've made such mistakes at
times).
2013-09-30 18:09:04 +09:00
Bill Currie
db460155e9 Fix multiple function calls in expressions. 2013-09-27 23:15:57 +09:00
Bill Currie
70d18ecfa1 Add a test for functions in binary expressions.
As expected, the binary_expr() cleanup broke multiple function calls in a
single expression.
2013-09-27 23:15:57 +09:00
Bill Currie
4bc40b3917 Rewrite binary_expr().
It is now in its own file and uses table lookups to check for valid type
and operator combinations, and also the resulting type of the expression.

This probably breaks multiple function calls in the one expression.
2013-09-27 23:15:57 +09:00
Bill Currie
ec98954dfc Remove the small struct optimization.
It might cause trouble for the binary_expr() cleanup.
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
b66cbeeb57 Run fold_constants on comparison operands.
This is a bit of a workaround to ensure the operands have their types
setup correctly. Really, binary_expr needs to handle expression types
properly.

This fixes the bogus error for comparing the result of pointer subtraction
with an integer.
2013-09-27 23:15:57 +09:00
Bill Currie
c13f2c2c23 Fix the support for [s, v] for quaterions. 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
2572811bf4 Add support for quaternion.w/x/y/z.
It's sometimes more useful to have direct access to each individual
component of the imaginary part of the quaternion, and then for
consistency, alias w and s.
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
Bill Currie
35de42aeac Catch bogus comparison types.
This fixes an ICE when trying to compare a function with a float.
2013-09-27 23:15:56 +09:00
Bill Currie
03fb47d7ba Fix some sizeof goofs.
Yay for continually improving gcc warnings :)
2013-09-26 17:45:30 +09:00
Bill Currie
16d899ace5 Remove the string:string concatentation TODO item.
I think it may have been for compatibility with a certain qcc variant (no
idea which one, though). While the shift/reduce conflict is fixable using
"%prec IFX" on the const:string rule, the colon breaks test?"a":"b".
Putting parentheses around "a" allows such a construct, requiring them
breaks comatibility with C. I think this feature just isn't worth that.
2013-06-26 23:04:35 +09:00
Bill Currie
257597fd38 Update ifstring in TODO
It seems to be done, but...
2013-06-26 23:04:35 +09:00
Bill Currie
cef2136050 Implement "not" logic for while and do-while.
This goes towards complementing the "if not" logic extension. I need to
check if fteqcc supports "not" with "while" (the version I have access to
at the moment does not), and also whether it would be good  to support
"not" with "for", and if so, what form the syntax should take.
2013-06-26 23:04:35 +09:00
Bill Currie
45a09e195e Add more TODO items (strings stuff) 2013-06-26 23:04:35 +09:00
Bill Currie
6fa63f6c54 Implement the basics of fteqcc's -Fifstring.
It's -Cifstring in qfcc, but otherwise the intent is the same. More testing
and investigation into what fteqcc does is required.
2013-06-26 23:02:55 +09:00
Bill Currie
8d34d33055 Implement "if not (foo)" syntax.
It is syntactic sugar for if (!(foo)), but is useful for avoiding
inconsistencies between such things as if (string) and if (!string), even
though qcc can't parse if not (string). It also makes for easier to read
code when the logic in the condition is complex.
2013-06-26 23:02:55 +09:00
Bill Currie
77337e2402 Separate "" and nil.
It turns out this is required for compatibility with qcc (and C, really).
Once string to boolean conversions are sorted out completely (not that
simple as qcc is inconsistent with if (string) vs if (!string)), Qgets can
be implemented :)
2013-06-26 23:02:55 +09:00
Bill Currie
fd1ea9e00e Add an option to control the enum switch warning. 2013-06-26 09:29:37 +09:00
Bill Currie
29df4ac7ee Fix case label lookup.
It looks like I had forgotten that the compare function is supposed to
return true/false (unlike memcmp's sorting ability). Also, avoid the
pointers in the value struct as they can change without notice.

Using enums in switches now works nicely, including warnings for unused
enum values.
2013-06-26 09:29:31 +09:00
Bill Currie
8ac2c3a04d Check for unused enum values in switch statements.
Unfortunately, it turns out the value lookup is broken (including for
duplicate cases).
2013-06-26 09:25:45 +09:00
Bill Currie
35bc981402 Allow use of a jump table when switching on an enum. 2013-06-26 09:25:45 +09:00
Bill Currie
64f76bd762 Use the right value when getting a function's defref.
Either I had gotten confused while writing the code and mixed up line and
offset, or I had changed offset to line at one stage but missed a place.
This fixes the segfault when compiling chewed-alias.r and return-ivar.r
2013-06-24 09:16:55 +09:00
Bill Currie
125ef1f0ff Move the whole separator test/creation into a function.
This will make the next stage easier. (except that seems to be slower)
2013-03-19 20:39:01 +09:00
Bill Currie
f2452eb3c3 Rewrite the inner-loop of FindSeparators.
For the most part, it's just refactoring the code so the plane creation and
testing are in separate functions, but there is one important difference:
the plane test now checks only the two points on either side of the point
used to create the plane.

Because the portal winding is guaranteed to be convex and planar, if both
points are on the plane, all points are, and if neither point is behind the
plane, no points are.a

This shaved about 5 seconds off the level 4 run using 4 threads (~198s to
~193s) and about 12s from the single threaded run (~682s to ~670s (hmm,
gained some time in recent changes)).
2013-03-19 17:00:00 +09:00
Bill Currie
d7c1bc8d02 Correct a comment.
I had gotten confused between figuring out the windings and writing the
comments, I guess.
2013-03-19 16:23:47 +09:00
Bill Currie
8938870e46 Make the default output a little nicer. 2013-03-19 13:07:44 +09:00
Bill Currie
dff0b89a6c Detect the number of CPUs available.
Now qfvis will default to multi-threaded on multi-core machines.
2013-03-19 12:05:50 +09:00
Bill Currie
88e5adcec6 Make the base vis multi-threaded.
Now multi-threaded qfvis is on par with tyrutils vis (differences usually
<1s, sometimes more, sometimes less).
2013-03-19 11:42:09 +09:00
Bill Currie
32b6d15931 Use a sorted queue for portals.
qsort is used to sort the queue by nummightsee. At ~4ms for 20k portals, I
think it's affordable. Using a queue rather than scanning the portal list
each time loses the dynamic sorting when mightsee gets updated, but it
seemed to shave off 4s anyway (~207s to ~203s (maybe, yay random times)).

Another step towards threaded base-vis.
2013-03-18 21:14:12 +09:00
Bill Currie
7e40981dcd Move the LeafThread setup to its own generic function.
This is for threading base-vis.
2013-03-18 21:11:46 +09:00
Bill Currie
cb096c601d Use a per-portal rwlock for portal updates.
This should make qfvis scale a little better with cpu count.
2013-03-18 15:03:11 +09:00
Bill Currie
c824e668ed Rework some of the pthread stuff.
Init/uninit is now separate from portal vising.
The global lock has a better name and is now a rwlock.
Use a separate lock for the stats.
2013-03-18 14:26:52 +09:00
Bill Currie
134381f79b Reduce the locking in the portal completion code.
It doesn't seem to make much difference, but the less room for contention,
the better.
2013-03-18 13:45:19 +09:00
Bill Currie
ffb6d628bd Simplify the pthreads detection macros. 2013-03-18 13:31:35 +09:00
Bill Currie
1c20a49dba Use the recursive set allocator for mightsee.
This completely removes the lock used to protect the set allocation code
while keeping the use of the set api clean.
2013-03-18 13:30:50 +09:00
Bill Currie
a28ec8aa82 Revert "Allocate stack blocks and mightsee in one block."
This reverts commit 1ea79e8626.

Conflicts:
	tools/qfvis/include/vis.h
	tools/qfvis/source/flow.c

I've decided to do reentrant versions of the set allocators and I didn't
particularly like the invasiveness of allocating sets this way.
2013-03-18 12:47:59 +09:00
Bill Currie
ad247fa12d Rename some variables and remove some comments.
The old variable names were confusing ("target" winding comes from
"portal"?), and the comments were from when I really didn't understand
concepts like separating planes. While they weren't wrong, they were quite
inadequate and I want to write new ones.
2013-03-17 21:52:08 +09:00
Bill Currie
ccc432a7ea Give the fields of pstack_t clearer names.
And some comments.
2013-03-17 19:18:38 +09:00
Bill Currie
1ea79e8626 Allocate stack blocks and mightsee in one block.
This bypasses set_new, but completely removes the use of the global lock
from within RecursiveClusterFlow. This seems to give a small speedup: 203
seconds threaded.
2013-03-17 16:37:27 +09:00
Bill Currie
1d262f7dea Clean up FindSeparators a little bit.
This was testing an idea I had to remove the plane flips. It seems to have
been good for the initial plane orientation, but was a slight slowdown for
the pass-portal test. However, this makes the code a little easier to work
with for my idea on improving the algorithm itself.
2013-03-17 10:16:47 +09:00
Bill Currie
5dba419233 Cache stack blocks and working mightsee sets.
Since the stack structure in the thread data is a linked list, move the
stack blocks off the program stack and into malloced memory. More
importantly, when the stack block is allocated, the mightsee working set is
allocated too, and as neither are freed, this greatly reduces contention
for the lock. Also, because the memory is kept, single threaded time for
gmsp3v2 dropped from 695s to 670s. Threaded is now about 207s (down from
350).
2013-03-16 22:58:59 +09:00
Bill Currie
2ea143283c Rewrite mightsee_more to manipulate the sets directly.
While using set operators was clearer, it was rather expensive (about 25s
for gmsp3v2). qfvis now completes the map in about 695s (single threaded).
About 15s faster than tyr for the same conditions (1 thread, level 4).
2013-03-16 21:51:41 +09:00
Bill Currie
195bdcb92f Rework FindSeparators to make use of the winding direction.
This is the second part of the separator search optimization from tyrutils
vis. With this, qfvis is getting close to tyrutils vis when
running single threaded (qfvis is suffering some nasty thread contention
and thus can't get below about 350 seconds with 4 threads). 808s vs 707s.
2013-03-15 22:05:01 +09:00
Bill Currie
9b10304c2f Make CopyWinding const-correct. 2013-03-15 19:25:24 +09:00
Bill Currie
5a2ee06787 Reverse the winding for backside portals.
This is part 1 of another optimization from tyrutils vis. It seems that
just reversing the winding gives a tiny speedup.
2013-03-15 19:22:57 +09:00
Bill Currie
46d41ad9ac Split up separator finding and winding clipping.
Interesting, it makes very little (maybe faster) difference to find all the
separators for levels 3 and 4. This might be due to the higher levels using
most of the planes to fully clip source away. Anyway, it makes the code a
little clearer (one function, one task).
2013-03-15 16:00:39 +09:00
Bill Currie
f80ae52828 Make vis's ClipWinding const-correct. 2013-03-15 15:28:25 +09:00
Bill Currie
77c858060d Add a bunch more statistics.
Now I know why sphere culling was a loss: 78% of all tested target portals
were trimmed by ClipToSeparators (50% eventually clipped away entirely).
2013-03-14 19:43:46 +09:00
Bill Currie
97da7fe31d Document some fields. 2013-03-14 19:43:46 +09:00
Bill Currie
8032d1d4d1 Split out the mightsee intersection/subset tests.
Having the code in separate functions makes the flow in the main loop a
little easier to follow.
2013-03-14 19:43:46 +09:00
Bill Currie
eec87bd61b Remove thread from stack_t.
It really wasn't gaining anything and made reading the code a little
harder.
2013-03-14 19:43:46 +09:00
Bill Currie
057a5cc624 Make BasePortalVis another 17% faster.
I had forgotten to skip the refined tests when the sphere was entirely on
the relevant side of the plane. Now BasePortalVis for gmsp3v2 takes 11s on
my machine (it was 13 with the previous optimization and 15.9 before that).

Also, write some comments describing how BasePortalVis works.
2013-03-14 14:01:26 +09:00
Bill Currie
5d6df082f2 Move the vis stats vars into thread data.
This should make the stats more reliable when running multi-threaded
(chains is still random, but it seems there are set access issues).
2013-03-14 12:52:40 +09:00
Bill Currie
0cae04d71a Alter test_sphere to return -1, 0 or 1.
Representing the side of the plane on which the sphere lies is much more
useful as more complicated tests can be done using just the one call.
-1: the sphere is entirely on the back side of the plane
 0: the sphere is intersecting the plane
 1: the sphere is entirely on the front side of the plane
2013-03-14 09:05:26 +09:00
Bill Currie
b9d71218f6 Use sphere culling in the base vis.
Base vis was done first for testing. Optimized base vis is down to ~12.4s
from ~16s (29% faster?).
2013-03-13 21:32:18 +09:00
Bill Currie
fe55bb678e Set the default level to 4.
It was supposed to be 2, but for some reason I neglected to set it when I
set up the options parsing. However, level 4 is the standard for production
maps, and it happens to be faster than level 2 (at least for gmsp3v2.bsp)
2013-03-09 15:01:54 +09:00
Bill Currie
3232c22795 Implement mightsee updates from tyrutils.
It doesn't seem to make much difference, but I suspect that's my set code
not being optimal for the job.
2013-03-09 14:32:51 +09:00
Bill Currie
d1e65257b6 Implement the cached separators idea from tyrutils.
I think the reason I didn't think of that when I tried to improve qfvis's
performance many years ago is I just simply did not understand
ClipToSeparators. However, the difference caching the separators makes is
phenomenal. Before the change, single threaded qfvis would get stuck on one
particular portal for at least a day (I gave up waiting), but now even a
debug build will complete gmsp3v2.bsp in less than 12 minutes (4 threads on
my quad-core). And that's at level 2! Getting stuck for a day was at level
0.
2013-03-08 22:20:29 +09:00
Bill Currie
ca0b03687f Change the naming of ALLOC's free-list.
Rather than prefixing free_ to the supplied name, suffix _freelist to the
supplied name. The biggest advantage of this is it allows the free-list to
be a structure member. It also cleans up the name-space a little.
2013-03-08 22:16:31 +09:00
Bill Currie
dbdfdb6d28 Add support for PRT2 portal files.
These seem to be identical to PRT1-AM but with a different count order in
the header. Taken from tyrutils-0.5.
2013-03-07 18:51:32 +09:00
Bill Currie
0649fd7022 Correct some verbosity levels. 2013-03-07 18:51:23 +09:00
Bill Currie
4e87072d93 Fix a bunch of whitespace. 2013-03-07 14:31:00 +09:00
Bill Currie
4ccb4a4667 Make the test and vis set pointers const. 2013-03-07 14:28:15 +09:00
Bill Currie
281c5f185d Correct the "can see anything new" check.
I had the super-set and sub-set parameters backwards, but that's because I
had misinterpreted the old code.
2013-03-07 14:24:30 +09:00
Bill Currie
81e4d3072c Plug a bunch of memory leaks.
Not that they really matter, but it makes reading valgrind's output a
little easier.
2013-03-07 13:42:19 +09:00
Bill Currie
9b4beaf3f8 Use a set for portalsee.
This removes the hard coding of the size of portalsee, which looks to have
been too small for some maps.
2013-03-07 11:35:08 +09:00
Bill Currie
299ff8f575 Use set functions for qfvis.
While noticeably slower than the previous expanded set manipulation code,
this is much easier to read. I can worry about optimizing the set code when
I get qfvis behaving better.
2013-03-07 11:06:55 +09:00
Bill Currie
5950803462 Implement the sun lighting calculations.
The sun(s) won't work right now because the vectors aren't properly set up.
2013-03-07 09:11:23 +09:00
Bill Currie
4d4bcaf3a3 Make the Test functions const-correct. 2013-03-07 09:11:23 +09:00
Bill Currie
0e82b37001 Parse the sun information from the worldspawn entity. 2013-03-07 09:11:23 +09:00
Bill Currie
f1a18742f1 Cache the worldspawn entity.
It is an error (for now) if there is not exactly one worldspawn entity.
2013-03-07 09:11:23 +09:00
Bill Currie
4f0a1df3c1 Implement sky tracing.
Again, this is from Jardrup's light tool. Sun data is not yet parsed, nor
are any sun lighting calculations done.
2013-03-07 09:11:23 +09:00
Bill Currie
7cd1894a6d Add the solid-sky option from Jardrup's light tool.
However, actual sky tracing is not yet implemented.
2013-03-07 09:11:23 +09:00
Bill Currie
32127d3ec7 Kill a sprintf.
While 16 chars is enough for any 32-bit int, if int ever changes to 64
bit... (need 21). Just avoid the issue with good old va :)
2013-03-07 09:11:23 +09:00
Bill Currie
d2909cd4dd Clear the padding in the light data buffers.
Getting uninitialized memory in calloced space was interesting :P
2013-03-07 09:11:23 +09:00
Bill Currie
7c1d9d2b84 Make the angle and light hacks optional.
I'd forgotten that ED_ConvertToPlist mangled light into light_lev and
single component angle values into a vector. This fixes much of the
breakage in qflight (but not the light levels)
2013-03-07 09:11:23 +09:00
Bill Currie
26baa75a1b Remove a stray break.
Now qflight mostly works (its results are bogus, but at least it no longer
crashes or errors out)
2013-03-07 09:11:22 +09:00
Bill Currie
5fc8d1eb26 Split out the surface offset code.
This tidies up LightWorld a little.
2013-03-07 09:11:22 +09:00
Bill Currie
48809404b1 Use qfplist for light entities.
This removes a lot of redundant code from qflight (though it does become
dependent of libQFgamecode *shrug*). The nice thing is qflight now uses the
exact same code to load entities as does the server.
2013-03-07 09:11:22 +09:00
Bill Currie
9e6477fdf0 Remove the leading _ from entity fields for properties.
Dealing with the _ in the properties code is a bit messy, and having to use
it in the properties list file is a pain.
2013-03-07 09:11:22 +09:00
Bill Currie
5fbe50a5e2 Remove some dead code. 2013-03-07 09:11:22 +09:00
Bill Currie
b01986c3c5 Correct some white space. 2013-03-07 09:11:22 +09:00
Bill Currie
c9b1c445a8 Move the properties docs into properties.h 2013-03-07 09:11:22 +09:00
Bill Currie
5720392f37 Begin documenting qflight. 2013-03-07 09:11:22 +09:00
Bill Currie
cc92466725 Correct the calculation of halflife lighting.
The RBG values were taken from the wrong components of the array
(out-by-one).
2013-03-07 09:11:22 +09:00
Bill Currie
b025e7ba9a Make sure all source files in qflight have (C) headers. 2013-03-07 09:11:22 +09:00
Bill Currie
4d0a08a052 Cope with 0 sized textures.
The most likely cause is missing texture data. Found while working on the
uv_layers bug for Hectate.
2013-03-04 11:04:47 +09:00
Bill Currie
a6bc5e9d29 Use the correct method for finding the active uv layer.
Problem found by Hectate in #qc (thank you!).
2013-03-04 10:50:42 +09:00
Bill Currie
f6966f89ec Add DL_LIBS to the -x11 targets.
Something is funny with Ubuntu such that -ldl needs to be specifically
added even though QFutil's .la specifies it. I don't know if it's a libtool
issue or not, but this does work.

More will probably be necessary, but this was sufficient to get prover to
the point where qfcc segged building qwaq (0.7.2).
2013-02-14 09:54:36 +09:00
Bill Currie
4e7e7c3ab0 Rename Sys_FileTime to Sys_FileExists.
The function never did anything but check the readability of the file.
2013-02-07 15:43:26 +09:00
Bill Currie
9d418379bf Use the correct type when allocating flow node edges.
sizeof (struct) vs sizeof (struct *). Ouch.
2013-01-30 18:08:59 +09:00
Bill Currie
6a3c775270 Correct the emission of meta class ivars.
type_obj_class is no longer a class, so its ivars are not stored in
type_obj_class.t.class->ivars but rather type_obj_class.t.symtab.

This fixes the segfault Spirit and Randy were experiencing.

In passing, correct the unneeded emission of meta class ivars for non-root
classes. This should make for much smaller progs that use classes.
2013-01-30 18:06:48 +09:00
Bill Currie
dffe1598b8 Strip the executables.
While nq-sdl.exe was ok (~6.5MB vs ~4.2M), qw-client-sdl.exe was crazy:
~17MB vs ~7.4.
2013-01-23 22:09:54 +09:00
Bill Currie
b7d6ffa72e Build and package win64 binaries too.
As an added benefit, this tested the "one cross dir" design of my scripts
:)
2013-01-23 11:59:54 +09:00
Bill Currie
f68ae3ad5d Add support for 64bit windows via mxe (mingw).
Note that this support relies on the -multi branch (separate git repo on
github) util it gets merged.
2013-01-22 21:02:50 +09:00
Bill Currie
61bdb13c4c Remove obsolete mingw cross.sh script.
Now that mxe is here (and works nicely), this is no longer necessary
(doesn't work anyway).
2013-01-22 21:02:50 +09:00
Bill Currie
e27d7cbd2d Handle alloca "correctly".
Use AC_FUNC_ALLOCA and the #ifdef mess suggested by the autoconf docs
(hidden in qfalloca.h).
2013-01-22 21:02:50 +09:00
Bill Currie
f1aefc969d Fix some 64-bit mingw compile issues.
Just one more issue to fix (alloca), but with a hack, QF compiles (no clue
yet if it works: wine doesn't seem to be an option at this stage)
2013-01-22 21:02:49 +09:00
Bill Currie
0186ca993d Allow the uninitialized variable warning to be suppressed. 2013-01-18 16:28:08 +09:00
Bill Currie
eacc59c016 Build the field types array for enums, too.
However, every element is the same: type_default's type_def. This fixes the
segfault building qwaq introduced by the previous enum commit.
2013-01-17 22:01:31 +09:00
Bill Currie
46d2959908 Delay calling find_type for enums.
As find_type encodes the type too, calling find_type before the enumerators
have been created causes the type encoding to lose the enumerators.
2013-01-17 20:55:25 +09:00
Bill Currie
7a504f8983 Use float for enum defs in v6 progs.
The values are (or should be!) written as floats, so don't give any
debuggers hernias when displaying enums in v6 progs.
2013-01-17 20:53:22 +09:00
Bill Currie
00192ea1da Skip field immediates when generating progdefs.h
They break the very fragile algorithm :P.
2013-01-17 16:10:17 +09:00
Bill Currie
5b47c15611 Get the bmesh directly from the object mesh data.
Yay, no fussing with edit mode. Thanks to _FrnchFrgg_ in #blendercoders for
the tip.
2013-01-17 09:52:09 +09:00
Bill Currie
ca71034680 Make the field value editable. 2013-01-17 09:52:09 +09:00
Bill Currie
66ecf9eba0 Update the entity field list for blender 2.65a+
More api changes :/ However, the new version certainly seems more powerful.
2013-01-17 09:52:09 +09:00
Bill Currie
f25fbfe0bc Split out the text reflow code.
This makes EntityPanel's draw code a little cleaner.
2013-01-17 09:52:09 +09:00
Bill Currie
6838913e31 Fix view3d callback for blender 2.65a+.
Yay experimental APIs :P
2013-01-17 09:52:09 +09:00
Bill Currie
acd25fb7bb Update the release script for git versioning. 2013-01-11 10:47:49 +09:00
Bill Currie
9afeae0c47 Fix the mis-specified PKG_CONFIG_LIBDIR for mips.
D'oh, forgot usr :P
2013-01-10 21:13:19 +09:00
Bill Currie
89ae5cbf7c Remove the old hacks for qp-lex, too. 2013-01-10 19:42:34 +09:00
Bill Currie
737347b0f6 Remove the prototypes hack.
While configure isn't testing yet, we need recent bison and flex, so many
of the old hacks are no longer necessary.
2013-01-10 19:27:22 +09:00
Bill Currie
39ae720613 Fix an error in qfcc's man page.
--qccx-escapes doesn't take an arguement :P
2013-01-08 16:19:40 +09:00
Bill Currie
76a69d9a53 Implement fteqcc's "nosave" specifier.
Of course, it's "@nosave" for traditional progs, but that's only a define
away.
2013-01-07 14:35:34 +09:00
Bill Currie
955e3ee258 Initialize the type to be ev_func.
This fixes the returning of the wrong function symbol when resolving
overloaded functions and one of the functions takes no parameters.
2013-01-07 13:52:48 +09:00
Bill Currie
338bb9bba0 Look up the function symbol when resolving overloaded functions.
This fixes the bogus undefined symbol errors when resolving unambigous
overloaded functions.
2013-01-07 13:51:01 +09:00
Bill Currie
e0e69ac71a Fix some signed/unsigned comparison warnings.
It seems mingw's gcc treats pointer subtraction differently to how linux's
gcc does.
2013-01-05 17:52:48 +09:00
Bill Currie
34c0c82408 Add support for binary constants using the 0b prefix.
Just because :P (now that gcc support it, it seems worthwhile, I guess)
2013-01-04 19:32:04 +09:00
Bill Currie
b225879d16 Print all four sets with a legent for live vars.
Much more informative :)
2012-12-26 11:54:49 +09:00
Bill Currie
c5179c9e99 Add MOVEP's opc to the use set.
MOVEP's opc itself is always known and used, whether it's a constant
pointer or variable doesn't matter. This fixes the lost pointer calculation
for va_list.list[j] = object_from_plist (item);
2012-12-26 11:53:06 +09:00
Bill Currie
412fb4aacd Fix a static out of bounds error.
I really must compile with optimizations more often :P
2012-12-26 11:51:40 +09:00
Bill Currie
88c765e210 Add a test for returning @param into an array. 2012-12-26 11:49:39 +09:00
Bill Currie
386a729209 Remove dead nodes from dags.
Dead nodes are those that generate unused values (unassigned leaf nodes,
expressions or destinationless move(p) nodes). The revoval is done by the
flow analysis code (via the dags code) so that any pre and post removal
flow analysis and manipulation may be done (eg, available expressions).
2012-12-25 17:07:58 +09:00
Bill Currie
3baa73e60e Increase qwaq-x11's hunk space to 8MB.
1MB is too small for the few sounds my experimental game uses.
2012-12-25 15:47:00 +09:00
Bill Currie
1e3154ecd5 Do not always reset current_storage.
resetting current_storage in external_def_list's empty rule breaks the
block storage scopes (extern { ... } etc);
2012-12-25 13:43:52 +09:00
Bill Currie
e414117fe8 Move jump threading into the dead-code removal loop.
Dead code removal can give more opportunities to the useless branch removal
in the jump threading code.
2012-12-25 13:33:31 +09:00
Bill Currie
07187cae7c Remove useless conditional branches too.
"if x" jumping to the next statement is pretty useless.
2012-12-25 13:23:14 +09:00
Bill Currie
92fffb3c7e Check for a flow var for temp aliases. 2012-12-25 13:22:31 +09:00
Bill Currie
9d27764576 Use new_binary_expr to recreate the assignment.
assign_expr mangles the destination expression for dereferenced
assignments into something that is invalid as an lvalue, so simply use
new_binary_expr with the same opcode.
2012-12-24 20:12:56 +09:00
Bill Currie
0fc8aa54e1 Make expr->next edges constrained.
It turns out expression trees are (mostly?) valid DAGs, so all edges being
constrained works, though the graphs get a little tall (but easier to read).
2012-12-24 20:06:38 +09:00
Bill Currie
79519bc357 Avoid testing block expressions in truth assignments.
This fixes the infinite loop in if ((x = self.heat && x))

Really, I think I need to revisit the whole expression tree code. It's
proving to be rather fragile.
2012-12-24 20:01:16 +09:00
Bill Currie
60af059b6e Allow arbitrary expressions in a bool's block.
This generates correct code for "if ((x = y))": the assignment still
occurs.
2012-12-23 19:57:39 +09:00
Bill Currie
f6c4e06183 Reimplement assignment as truth value.
The source of the assignment is used as the value to test, and the
assignment itself is inserted into the boolean expressions's block. This
fixes the inernal error for "if ((x = 0))".
2012-12-23 19:53:31 +09:00
Bill Currie
a881fb5f5b Make float values obvious in expression dot dumps. 2012-12-23 19:34:25 +09:00
Bill Currie
f65ce22ddc Fold constants for the return value of test_expr.
More constantness preservation.
2012-12-23 19:32:32 +09:00
Bill Currie
22db05dc9c Alias value expressions by aliasing the value.
This keeps constant expressions constant, even through aliasing.
2012-12-23 19:31:09 +09:00
Bill Currie
b295524385 Add new_value_expr().
This simplifies creating a new expression for an arbitrary value object.
2012-12-23 19:29:50 +09:00
Bill Currie
42ba0c9d54 Add alias_value() function.
alias_value returns a new value where only the type is different, the
bit-pattern of the value itself is untouched.
2012-12-23 19:25:35 +09:00
Bill Currie
82ded2b638 Split the test for assignment and parenthesis.
This will make it easier to fix the internal error for "if (x = 0)".
2012-12-23 14:55:16 +09:00
Bill Currie
b9a0e2ce03 Catch the error for undefined++. 2012-12-23 14:47:29 +09:00
Bill Currie
a778d45ebf Drop non-function symbols returned from function_symbol.
In such situations, everything is a mess from earlier errors.
2012-12-23 14:25:09 +09:00
Bill Currie
aae0e21a5b Treat class instance access as a normal error.
Normally, it will happen only as a follow-on error, but I can think of a
way to force it without other errors, so treating it as an internal error
is a bit harsh.
2012-12-23 06:01:20 +09:00
Bill Currie
996b2734a4 Reset current_class in the top-level error rules.
This fixes a weird internal error after a parse error in an ivar
declaration.
2012-12-23 05:57:13 +09:00
Bill Currie
1c76ccc425 Always set current_symtab in class_init().
But reset current_symtab to its prior value when done. This fixes a
segfault caused by initializing the class system while parsing a struct
(eg, one of the members is of type id).
2012-12-22 20:06:14 +09:00
Bill Currie
ff4b232d92 Reset current_storage when resetting current_symtab.
This helps prevent an internal error caused by ealier errors.
2012-12-22 20:04:11 +09:00
Bill Currie
85387e02cf Avoid class segfaults caused by parse errors. 2012-12-22 19:35:19 +09:00
Bill Currie
681bd6f4b2 Don't try to emit code if there have been errors.
The expression tree can't really be trusted if there have been errors.
While warnings as errors are another matter, it's not worth sorting out.
2012-12-22 19:22:08 +09:00
Bill Currie
adf3e36aee Get the tempop alias's type from the right place.
Temporyary aliases use only the low-level type, not the full type
descriptor. Fixes the segfault when dumping dot graphs.
2012-12-22 17:06:00 +09:00
Bill Currie
513d67c6c3 Splut up the keywrods table into categories.
The keywords table was rather awkward to edit (and sometimes confusing).
Worse, because the hash table used to look up the keywords was initialized
only once, changing modes in the same execution of qfcc would not work
properly as keywords would not be added or removed as appropriate.

Now there are four categories of keywords:
 o  "core"  Always available. They form the core of QuakeC except for two
            extensions.
 o  "@"     In extended and advanced modes, the preceeding @ is optional,
            but tranditional mode requires the keywords to be preceeded by
            an @. They are the C keywords that QuakeC did not use, but can
            be implemented in v6 progs under certain circumstances.
 o  "QF"    These keywords require the QuakeForge VM to be usable.
 o  "Obj"   These keywords form Ruamoko/Objective-QuakeC and require both
            advanced mode and the QuakeForge VM.
2012-12-22 16:31:14 +09:00
Bill Currie
7d928047ae Remove support for break as an identifier.
I never really liked it, but I have a better solution in the pipe-line.
2012-12-22 16:29:43 +09:00
Bill Currie
33bb422849 Force .param_N to be live when adding the edge to its node.
This fixes the segfault/null pointer access in sendv.r. While I wanted to
use the edge setting code to set the live bit, I didn't expect it to be
this easy. def_visit_all is proving to be worth every bit it consumes :)
2012-12-22 14:38:38 +09:00
Bill Currie
a95f679283 Add a test for compiling calls to obj_msg_sendv.
It seems dag_set_live_vars still served a purpose after all, but I don't
feel like bringing it as I'd rather implement its param handing in
dagnode_set_edges. I've now got a test case for it, though the test
currently causes the VM to segfault (even with pr_boundscheck 2!).
2012-12-22 14:05:12 +09:00
Bill Currie
175935ed8b Turn on bounds checking in the test harness.
Definitely want bounds checking for the tests.
2012-12-22 14:04:14 +09:00
Bill Currie
6eb6b6c0ba Change pointer_t to unsigned and clean up the mess.
It doesn't make sense to have negative pointers. The size of the commit is
from enabling gcc's -Wtype-limits warning and cleaning up that mess too.
2012-12-21 21:53:13 +09:00
Bill Currie
7701393bd4 Append a new sblock for return when necessary.
If the final block ends in a conditional statement, appending return to the
block will hide the conditional statement from the flow analyzer. This may
cause the conditional statement's destination node be become unreachable
according to the analyzer and thus eliminated. The label for the branch
then loses its target sblock and thus the code generator will produce a
zero-distance jump resulting in an infinite loop.

Thus, if the final block ends in a conditional statement (or, for
completeness, a call statement), append a new empty block before adding the
return statement.
2012-12-21 20:11:27 +09:00
Bill Currie
cb39cfc9ae Turn on the runaway loop detector for the test harness.
Definitely don't want any tests hanging.
2012-12-21 20:01:53 +09:00
Bill Currie
452728126d Check the expression type when casting constants.
Not all constant expressions are ex_value. This fixes the bogus errors and
ice in paroxysm.
2012-12-21 17:12:41 +09:00
Bill Currie
84a68b139e Rename set_iter_t's value to element.
Correct terminology and all :)
2012-12-21 14:09:00 +09:00
Bill Currie
37a282d916 Initialize the immediate before putting it in the hash table.
This fixes the excessive globals used on constants.
2012-12-21 13:17:07 +09:00
Bill Currie
6c2d0b04d3 Directly generate MOVEP for variable destination pointers.
When the destination pointer is variable, the MOVEP node will not have any
identifiers attached to it, so generate_moveps must not be used.
2012-12-20 21:28:34 +09:00
Bill Currie
7b1850917d Force RETURN's operand to be live.
This seems to be the final fix to get return-ivar.r working.
2012-12-20 21:18:27 +09:00
Bill Currie
13f09b10d6 Generate MOVEPs for attached identifiers.
The "address operator" has been stripped from the identifer so it needs to
be rebuilt, and the identifier itself is returned as the destination.
2012-12-20 20:58:19 +09:00
Bill Currie
453dacb356 Nuke dag_set_live_vars.
It is no longer needed thanks to the exit dummy node used for making
globals live.
2012-12-20 20:57:11 +09:00
Bill Currie
cc0373cdca Correct a pair of spelling mistakes.
Hopefully, noone would ever see them anyway.
2012-12-20 20:55:25 +09:00
Bill Currie
a51ca44b05 Record MOVEP's destination pointer only when variable.
If MOVEP's destination is variable, then the actual destination isn't (at
this stage) knowable, so it can't be attached to the dagnode and thus must
be a child.
2012-12-20 19:08:50 +09:00
Bill Currie
4d587eaa25 Use flow_analyze_statement to get statement operands.
Getting the operands directly from the statement was missing the
destination operand of movep when movep's op_c was a constant pointer and
thus the flowvar wasn't being counted/created early enough. This led to a
segfault in the set code when attempting to add -1 to the set.
2012-12-20 19:02:55 +09:00
Bill Currie
5ec4598fce Fix a double out-by-one error.
This fixes the aliasing problem brought to light by the recent dead-code
removal work.

* taniwha dons a brown paper bag.
2012-12-20 16:33:01 +09:00
Bill Currie
580fba2cd1 Print the type of temporary operands.
It turns out the recent dead-block code "broke" vector component access
from objects. The breakage is really highlighting a problem with temporary
operands and aliasing. The problem was hiding behind a basic-block split
that the recent dead-block work mended and thus exposed the bug.
2012-12-20 14:47:18 +09:00
Bill Currie
7642c666db Implement protocol checking in categories. 2012-12-20 13:42:19 +09:00
Bill Currie
0cc90c006b Implement protocol checking.
It's very basic and incomplete (doesn't check categories), but it's a good
start.
2012-12-20 13:12:26 +09:00
Bill Currie
6d6f231bd2 Fix mangling of types when attaching protocols.
The protocol attachment test was in the wrong place, and there were some
typos in compare_protocols and procollist_find_protocol.
2012-12-20 13:12:05 +09:00
Bill Currie
211a7a8bbb Create and use more type checking functions. 2012-12-20 11:11:59 +09:00
Bill Currie
8c2af5cff7 Add more convenience functions.
Cleans up obj_types_assignable a little.
2012-12-20 10:10:41 +09:00
Bill Currie
3af031c33d Move the rest of the obj specific stuff into class.c.
This gives better hiding of implementation details.
2012-12-20 10:10:41 +09:00
Bill Currie
7cb2e40bce Add is_pointer convenience function. 2012-12-20 10:10:41 +09:00
Bill Currie
64c98bd4c3 Rename is_id to obj_is_id.
Better naming convenion.
2012-12-20 10:10:41 +09:00
Bill Currie
686858a59d Use the symtab to check for qualified id.
type_id is implemented as a pointer to "struct obj_object" (ie, not really
a class), so the correct check is to ensure the type is:
 1  a pointer
 2  to a struct
 3  using the same symbol table as type_obj_object
2012-12-20 10:10:41 +09:00
Bill Currie
4f81a659b4 Move is_id() from type to class.
type_id's implementation should remain "private" to class.c
2012-12-20 10:10:41 +09:00
Bill Currie
f181772a76 Attach protocolrefs to class types.
The protocolrefs (as protocollist_t) are attached to the type as a
qualifier.
2012-12-20 10:10:41 +09:00
Bill Currie
45c753f639 Catch attempts to create a static instance of a class.
It is actually an error to create a static instance of a class.
2012-12-20 10:10:41 +09:00