Commit graph

3683 commits

Author SHA1 Message Date
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
Bill Currie
f7006f13e8 Add .m to the list of recognized language extensions. 2012-12-20 10:10:41 +09:00
Bill Currie
4868a245b3 Fix the "for new syntax" FIXME.
Empty structs are now (correctly) invalid. The hack of using an empty
struct to represent a handle returned from a builtin has been unnecessary
since opaque structs were implemented: now a pointer to an opaque struct
can be used. This is mostly safe as handles are aways negative and thus
attempting to dereference such a pointer should result in a VM error. It
will be even safer once const is implemented and the pointers can be made
constant (eg, typedef struct handle * const handle;)
2012-12-20 10:10:41 +09:00
Bill Currie
3e94869f1e Remove the function overloading FIXMEs.
It seems they were fixed a long time ago.
2012-12-20 10:10:41 +09:00
Bill Currie
c68578d15d Rename CONST to VALUE.
VALUE is a much more accurate name, and this allows for "const" to be
implemented at some stage.
2012-12-20 10:10:41 +09:00
Bill Currie
fe7cd7e7a7 Catch omitted parameter names from function definitions.
void foo (int); is fine for a prototype (or, presumably, a qc function
variable), but not for an actual function body. This fixes the segmentation
fault when the parameter name is omitted.
2012-12-20 10:10:41 +09:00
Bill Currie
cd7c53d223 Parse id <protocol> and classname <protocol>.
This is needed to allow compile-time protocol conformance checks, though
nothing along those lines has been implemented yet.

id has been changed from TYPE to OBJECT, required to allow id <proto> to be
parsed. OBJECT uses symbol, allowing id to be redefined once suitable work
has been done on the parser.
2012-12-20 10:10:41 +09:00
Bill Currie
97c89c667d Add more todo items. 2012-12-19 21:52:10 +09:00
Bill Currie
b5baf0914b Fix the old dead block removal code.
It uses the new block merge code. Now forgotten return statements are
detected properly (naive dead block removal) and all unreachable code is
eliminated (flow analysis unreachable node removal).
2012-12-19 20:09:59 +09:00
Bill Currie
ab6a3fefd9 Revert "Remove the dead block removal code."
This reverts commit 83ead0842f.

Note: does not compile.

It turns out basic dead block removal is needed for the "control reaches
end of non-void function" warning to work correctly.
2012-12-19 20:05:12 +09:00
Bill Currie
65561fc219 Clean up statement blocks.
Empty sblocks are removed (unless it's the only sblock), and blocks that
are split unnecessarily are merged.

This mostly fixes bogus "no return" warnings.
2012-12-19 19:46:58 +09:00
Bill Currie
21b5ea8075 Remove unreachable nodes.
Any nodes still marked as unreachable (dfn < 0) need to be removed so
graph->dfo is valid (only one node 0).
2012-12-19 17:08:48 +09:00
Bill Currie
3270bb3f5e Make node numbering int rather than unsigned.
(unsigned) -1 is not what I wanted :P
2012-12-19 16:50:06 +09:00
Bill Currie
927335a29c Break out the successors and edges code.
This will make for nicer code when everything is looped for unreachable
node removal.
2012-12-19 16:23:08 +09:00
Bill Currie
c7ae58d7a3 Allow flownodes and sblocks to be numbered independently.
The numbering will need to be independent when unreachable nodes are
removed.
2012-12-19 16:22:15 +09:00
Bill Currie
9d35ca607f Mark all nodes as unreachable.
flow_build_dfst() marks a reacable node as such by setting the node's dfn
to a value >= 0.
2012-12-19 16:00:58 +09:00
Bill Currie
32556b7210 Initialize the graph's depth first order array.
Unreachable nodes will cause the first elements of the array to remain
unwritten by df_search. This fixes the segfaults caused by unreachable
nodes (the reason they were an internal error before).
2012-12-19 15:55:29 +09:00
Bill Currie
a7e9defebd Remove the non-initial parentless node check.
Its purpose was to catch when the old dead block remover failed to remove
unreachable blocks, but that code is now gone.
2012-12-19 15:31:32 +09:00
Bill Currie
83ead0842f Remove the dead block removal code.
It has proven to be too naive as it is unable to remove unreachable loops.
2012-12-19 15:28:39 +09:00
Bill Currie
b9c5769e6d Allow messages to nil.
That is, [nil message];. I just found out this is "perfectly legal"
(http://www.otierney.net/objective-c.html).
2012-12-17 18:59:45 +09:00
Bill Currie
f1b1822528 Add the sound builtins to qwaq.
All one of them :P
2012-12-17 15:41:56 +09:00
Bill Currie
bf141a7d66 Enable sound in qwaq-x11 :)
If qwaq-sdl ever gets done (anybody know where some round twits are?), it
too will have sound. :)
2012-12-17 15:09:26 +09:00
Bill Currie
463e41082a Support struct style initializers for vectors and quaternions.
The current implementation probably needs more work, but for the case where
I needed it, it does the job.
grid.r💯     vector      size = {range, range, 0};
0115 store.f range, size
0116 store.f range, [$2ac]
0117 store.f .zero, [$2ad]
2012-12-16 14:24:19 +09:00
Bill Currie
d6ec944e5f Set a builtin methods func pointer.
Forgetting to set the func pointer is what caused the bogus "does not
respond to" message for -error:.
2012-12-16 12:01:12 +09:00
Bill Currie
aa14271764 Make param/format specifier mapping easier to read.
Just a bit of white space.
2012-12-16 12:00:39 +09:00
Bill Currie
2317811f2b Don't allocate space for locals for builtin functions.
While the symtab is needed for debug info, there is no need for any actual
data to be allocated for a builtin function's locals.
2012-12-15 13:13:40 +09:00
Bill Currie
f3e2e239b8 Use the class name in type encodings.
After all that effort getting the class def initialized early enough for
type encodings to work, it proved to be a problem: just including a header
with an interface in it would cause linker errors if there was no
implementation available (even if the class is never used).
2012-12-15 12:21:22 +09:00
Bill Currie
fb00391749 Update the mingw cross scripts for MXE.
I got MXE to build (took only an envvar and a couple packages, yay doc
reading), so I thought it time to update the scripts to use it (they assume
/opt/mxe).
2012-12-14 17:03:52 +09:00
Bill Currie
461572e6ad Fix constant folding for vectors and quaternions with floats. 2012-12-14 12:48:09 +09:00
Bill Currie
732d6a1520 Provide emulation for vector / float and quaternion / float.
The VM doesn't have such instructions, so emulate them via
vector * (1 / float) and quaternion * (1 / float).
2012-12-14 12:30:30 +09:00
Bill Currie
dc55034708 Mark aliases as live when a label is attached to a leaf node.
This fixes the lost return values in the menus.
2012-12-13 21:20:21 +09:00
Bill Currie
a7b7a114bc Don't kill the node to which an alias is being assigned.
This does not fix the lost return value the menus as that is caused by the
alias not being marked live when it should be.
2012-12-13 21:06:04 +09:00
Bill Currie
3e38c4aa48 Merge branch 'qfcc-cse'
qfcc now does local common subexpression elimination. It seems to work, but
is optional (default off): use -O to enable. Also, uninitialized variable
detection is finally back :)

The progs engine now has very basic valgrind-like functionality for
checking pointer accesses. Enable with pr_boundscheck 2
2012-12-13 20:17:28 +09:00
Bill Currie
47c721b32e Clear the dstring in test-harness's printf builtin.
PR_Sprintf always appends to the result dstring. I'm not sure if this is by
design or a bug, so I'll leave it be for now.
2012-12-13 14:59:42 +09:00
Bill Currie
decc3845c5 Kill any aliases when assigning to an aliased def.
Temps aren't supported yet :P

The alias defs themselves aren't killed (still want any assignments to
occur) but rather, their nodes are. Also, edges to the alias defs' nodes
are added to the assigning node. Fixes structlive.r :)
2012-12-13 14:43:43 +09:00
Bill Currie
2dc60d4f9a Allow tests for full overlap of defs.
Not actually used yet, but I imagine I'll want it.
2012-12-13 14:42:51 +09:00
Bill Currie
821081c9c8 Use the desination type for moves in assign_expr.
for <struct> = nil; the source type is void and thus probably the wrong
size.
2012-12-13 14:05:24 +09:00
Bill Currie
503154257c Fix an uninitialized variable.
Yay valgrind, boo taniwha.
2012-12-13 13:58:30 +09:00
Bill Currie
3665a0566a Add a test for struct writes.
This tests local kills via aliases.
2012-12-13 13:44:25 +09:00
Bill Currie
0ff6e8a471 Correct some spaces in the type dump output. 2012-12-13 13:33:13 +09:00
Bill Currie
cf05f65596 Add int_val and uint_val to @param and @zero.
I got fed up with using "int" types, but the members being "integer"
(hold-over from before the int rename).
Also, correct the names of those types and @va_list (error reporting was
chopping off part of the name).
2012-12-13 13:24:03 +09:00
Bill Currie
5681e0fd42 Treat certain move instructions as assignments.
MOVE (static move) and MOVEP to a pointer constant know exactly where their
data is going, so treat them similarly to assignments: save their
distination operands (the addressed def for MOVEP) and mark them as
defined.
2012-12-13 12:50:00 +09:00
Bill Currie
c61e03a0b9 Clean up operand creation.
Rather than having the creation scattered through the code, use helper
functions. Makes exposing operand creating saner.
2012-12-13 12:49:00 +09:00
Bill Currie
d990a956c0 More label count paranoia.
MOVEP can generate 4 daglabels.
2012-12-13 12:48:07 +09:00
Bill Currie
c295a0473e Add edges from call nodes to their param nodes.
Assinments to .param_N (0-7 for call, 2-7 for rcall) must occur before the
call, or weird things will happen.
2012-12-13 09:55:28 +09:00
Bill Currie
c477191488 Be a little more paranoid about daglabel counts.
I'm still a little worried about the number of labels needed with heavy
alias usage.
2012-12-13 09:50:18 +09:00
Bill Currie
204a0b3f72 Make def_visit_all return the actual result of visit.
This way, def_visit_all is a little more useful (though I think I might
redo the one case that's using this feature).
2012-12-13 09:47:00 +09:00
Bill Currie
028b19888f Check aliases for liveness when removing dead vars.
The live var flow analysis doesn't check for aliases. Rather than changing
it to check for aliases (which might break uninitialized var analysis, as
it uses "use" from the live var analysis), make dag_remove_dead_vars do the
check. Fixes the misplaced text in the menus.
2012-12-12 23:15:55 +09:00
Bill Currie
06d14f6433 Dump operand contents for verbosity > 1. 2012-12-12 16:21:33 +09:00
Bill Currie
07d348fbd8 Fix an uninitialized warning from recent gcc.
Nifty: if you pass a struct via reference to a function, and a field of
that struct may be both set and not set (eg, set only in an if statement),
gcc will report that field assuming that fields that are never set will be
set by the function (my interpretation).

* taniwha ponders the flow analysis for that
2012-12-12 14:28:35 +09:00
Bill Currie
099bbcbd8a Fix an uninitialized warning from recent gcc.
Nifty: if you pass a struct via reference to a function, and a field of
that struct may be both set and not set (eg, set only in an if statement),
gcc will report that field assuming that fields that are never set will be
set by the function (my interpretation).

* taniwha ponders the flow analysis for that
2012-12-12 14:12:21 +09:00
Bill Currie
dd03678a74 Ensure \n gets printed for the null type. 2012-12-12 13:44:22 +09:00
Bill Currie
48821f379f Set edges/live for addressed variables.
This fixes (again:P) the messup with .super.
2012-12-12 12:55:17 +09:00
Bill Currie
03fdbe9b86 Ensure the def is aliasing before adding edges.
Getting two nodes doubly connected for *to = *from++; was interesting.
2012-12-12 12:52:01 +09:00
Bill Currie
75be251d65 Create and use def_visit_all.
Even though it turned out there were only two copies of the def alias
handling code, I got tired of writing it. The code is easier to read, too
:)
2012-12-12 12:01:31 +09:00
Bill Currie
85e6dd965f Treat aliases of the same basic type as no-ops.
At the statement level, all pointer types are the same, so just return the
op obtained from the sub-expression when the low-level type of the alias
expression matches the low-level type of the type of type sub-expression
operand.

With this, the alias of a value code can be removed (I always thought it
was wrong), which is what broke calling obj_msgSend_super (type &.super
param lost the &).

Now I have to deal with pointer values in the optimizer :/
2012-12-11 20:44:40 +09:00
Bill Currie
76c9aa2930 Handle alias defs when building a dag.
When an alais def (or aliased def) is used, any overlapping aliases that
have previously been assigned need to be marked as live, and edges to the
aliases added to the new node. However, when assigned to, live-forcing
needs to be turned off.

This fixes the lost assignments to .super.
2012-12-11 19:57:19 +09:00
Bill Currie
045947706e Compare the base def spaces in def_overlap.
The space field in alias defs is always null and thus aliases would never
overlap the aliased def. Oops.
2012-12-11 19:51:34 +09:00
Bill Currie
998868e53c Maybe make dags a little easier to read. 2012-12-11 19:50:31 +09:00
Bill Currie
7607c7d649 Resurrect alias operands.
It turns out they are necessary for the code output from dags. This fixes
the ice for *to = *from++;
2012-12-11 15:52:37 +09:00
Bill Currie
8452f69a21 Use only the real temp for daglabels.
This fixes the bogus temps for "*to = *from++;", but qfcc ices due to the
operand types being lost. It seems alias operands need to be resurrected,
if only for code output by dags.
2012-12-11 15:20:52 +09:00
Bill Currie
50b0bd0b95 Use define from temp aliases as well to kill uninit defines.
Finally, the uninitialized temp warnings are fixed.
2012-12-11 13:04:06 +09:00
Bill Currie
5083679fcc Don't mask out the dummy defines from temp kills. 2012-12-11 12:58:16 +09:00
Bill Currie
6b4efaa3e4 Link temp aliases to their main def.
This fixes the kill sets not building properly.
2012-12-11 12:57:37 +09:00
Bill Currie
28c37b367d Fix the dummy definitions of temp vars.
I forgot to add func->num_statements :P. Fixes the weirdness where only
some alias temps were being (bogusly) detected as uninitialized. Now they
all are.
2012-12-11 12:27:23 +09:00
Bill Currie
b5a72320bb Make alias defs and temps more obvious in dumps. 2012-12-11 12:26:48 +09:00
Bill Currie
f358364ef2 Fix assignment of nil to a structure.
constfold.c seems to be getting a little long in the tooth :P
2012-12-11 11:53:01 +09:00
Bill Currie
8582e9de63 Make it possible to dump statement blocks in a flow graph.
Much nicer looking with proper back edges :). Not actually enabled, though.
2012-12-11 11:31:55 +09:00
Bill Currie
aeed16109f Add vecinit.r to the test-suite.
Ugh, I really need to take time out to do compile tests properly.
2012-12-10 21:09:53 +09:00
Bill Currie
3aa3a0945a Scan the statements in a node with suspect var usage.
When the naive uninitialized variable detection finds a node with possible
uses of uninitialized variables, the statements in the node are scanned one
at a time checking each usage and removing uninitialized definitions as
appropriate. vectest.r now compiles without warnings. As an added bonus,
accurate line number information is reported for uninitialized variables.

Unfortunately, there is still a problem with uninitialized temps in
switch.r, but that might just be poor handling of temp op aliases.
2012-12-10 20:49:08 +09:00
Bill Currie
426363cd0d Don't kill aliased definitions in the entry dummy block.
Only definitions for the def used in the current statement (whether an
alias or not) are suitable for killing. Doing otherwise defeats the purpose
of this work :P

Fixes the false negatives found in a modified quattest.r (commented out the
"tq.s = 0;" line).
2012-12-10 19:42:31 +09:00
Bill Currie
aa97979d98 Rewrite flow_uninitialized() to use reaching defs.
Nicely, the use sets from live_variable analysis can be used too, though
there are some problems with the naive implementation. For:

vector foo (float x, float y, float z)
{
	vector v;
	v.x = x;
	v.y = y;
	v.z = z;
	return v;
}

qfcc thinks v is uninitialized, but if "if (x) return nil;" (or any other
basic-block splitter) is put just before the return v; qfcc correctly
detects that v is initialized. The reason is that the inits are in the same
basic block as the return, and thus aren't affecting the reaching
definitions, which are stored per-block.

The naive implementation should be good for a fast-cull before doing a
per-statement check.
2012-12-10 15:58:51 +09:00
Bill Currie
c47cb697de Create dummy uses for global variables
The exit dummy block is setup to provide dummy uses of global variables to
the live variable analysis doesn't miss global variables. Much cleaner than
the previous code :) There may be some issues with aliases, though.
2012-12-10 15:27:07 +09:00
Bill Currie
2e105f17f2 Enable live var flow dumps. 2012-12-10 15:27:07 +09:00
Bill Currie
d2f2fdc28e Create dummy definitions for local variables.
The entry dummy block is setup to provide dummy definitions of local
variables so the reaching definitions analysis can be used to detect
uninitialized variables (not implemented yet). Fake statement numbers
(func->num_statements + X) are used to represent the definitions. Local
variables (ie, not temp ops) use their offsets (ie, the offset range they
cover) for X. Temp ops use their flowvar number + the size of the
function's defspace for X. flow_kill_aliases() should take care of temp op
aliasing, while the use of the actual offsets spanned by the variable's def
should take care of any wild aliasing so structures and unions should
become a non-issue.
2012-12-10 15:26:47 +09:00
Bill Currie
8f274f5b1d Add convenience functions for getting a def's offset and size. 2012-12-10 14:40:43 +09:00
Bill Currie
d717a0b3f2 Add dummy nodes at the beginning and end of the graph.
The dummy nodes are for detectining uninitialized variables (entry dummy)
and making globals live at function exit (exit dummy). The reaching defs
and live vars code currently seg because neither node has had its sets
initialized.
2012-12-10 13:56:26 +09:00
Bill Currie
f30741c875 Add fixed aliases to a statement's kill set.
Fixed aliases are those that will never change through the life of the
code. They are generated from structure accesses and thus what they alias
is always known.
2012-12-10 13:25:06 +09:00
Bill Currie
4f70b48370 Add a function to check if two defs overlap.
Very useful for alias handling :)
2012-12-10 13:23:45 +09:00
Bill Currie
fa45ab842f Make the reaching defs dot dump optional. 2012-12-10 12:17:20 +09:00
Bill Currie
e4dd86c36b Calculate reaching defs. 2012-12-09 22:37:59 +09:00
Bill Currie
f3adb70ee4 Move the var def/use calculation into flow_build_vars(). 2012-12-09 21:22:57 +09:00
Bill Currie
2bc3a36126 Split out the statement array building. 2012-12-09 21:12:53 +09:00
Bill Currie
17a2f86a22 Correct some comments. 2012-12-09 21:12:33 +09:00
Bill Currie
1c99cf50da Clean up the flow api a little. 2012-12-09 20:50:53 +09:00
Bill Currie
054d902d3a Document alias defs.
The diagram showing the basics of how alias defs work is in a spearate file
because it created to much clutter in the header file.
2012-12-09 19:43:12 +09:00
Bill Currie
e0c92b6089 Rename set_iter_t's member to value.
Makes more sense now that the membership of the value depends on the
inversion of the set.
2012-12-06 21:11:38 +09:00
Bill Currie
eb8fd55677 Move set.c into libQFutil.
Also move the ALLOC/FREE macros from qfcc.h to QF/alloc.h (needed to for
set.c).

Both modules are more generally useful than just for qfcc (eg, set
builtins for ruamoko).
2012-12-06 20:52:53 +09:00
Bill Currie
b28ac6672b Add support for set of everything, and a lot of docs.
Set of everything is implemented by inverting the meaning of bits in the
bitmap: 1 becomes non-member, 0 member. This means that set_size and
set_first/set_next become inverted and represent non-members as counting
members becomes impossible :)
2012-12-06 19:32:31 +09:00
Bill Currie
b6ae9867c2 Fully connect temps and their aliases. 2012-12-06 09:40:16 +09:00
Bill Currie
34e3ac1468 Fix jumpb's operand types.
Aliasing the jump table to an integer broke statement_get_targetlist with
the new alias def handling, and was really wrong anyway. I probably did
that due to being fed up with things and wanting to get qfcc working again
rather than spending time getting jumpb right.
2012-12-05 22:20:55 +09:00
Bill Currie
c06cd8fcc0 Cast constants at compile time.
This takes care of the internal error due to aliasing values.
2012-12-05 22:19:22 +09:00
Bill Currie
f7e174f3ba Be more clear about integral expression types.
Is that 7 a short? int? unsigned?
2012-12-05 22:18:13 +09:00
Bill Currie
7071a46936 Make convert_value create a new value.
It operating in-place proved to be troublesome.
2012-12-05 22:16:08 +09:00
Bill Currie
a099847026 Do a little bit of const correctness for type.[ch]
It's only the beginning :/
2012-12-05 22:15:19 +09:00
Bill Currie
fea806c155 Be more careful with boolean expressions.
Either true_list or false_list may be null.
2012-12-05 20:12:57 +09:00