Commit graph

4688 commits

Author SHA1 Message Date
Bill Currie
291898b46f [qfcc] Properly dup symbol for declaration
The unification of qc and c function symbol handling made it important
that the new symbol was a proper duplicate (minus being in a table) of
the old symbol. This fixes redeclared prototypes (especially for
qc-style functions, not encountered for c-style). Complete with unit
test :)
2024-08-30 21:45:37 +09:00
Bill Currie
ee6e38e2f9 [qfcc] Implement glsl's contructors for math types
I don't think this includes bools yet, and matrices aren't supported
yet, but float vectors work quite nicely.
2024-08-30 13:54:33 +09:00
Bill Currie
d0064c6c46 [qfcc] Implement a lot of glsl semantics
Other than contructors (and problems with the `out` block) qfcc can
compile fstrianglest.vert to what looks like working ruamoko code.
There's still a lot of work to do, though.
2024-08-30 13:51:31 +09:00
Bill Currie
4b369be8c1 [qfcc] Report correct type in enum/struct redefinitions
Enums are neither unions or structs.
2024-08-30 13:47:36 +09:00
Bill Currie
6d9e2bd926 [qfcc] Allow a single void typed parameter
It makes dealing with `foo(void)` a little easier in glsl's parser.
2024-08-30 13:32:32 +09:00
Bill Currie
1510d21cde [qfcc] Implement is_matrix correctly
There was a FIXME from before I'd figured out how I wanted to deal with
them. Now is_matrix returns true only if there's at least 2 columns.
2024-08-30 13:17:43 +09:00
Bill Currie
bca4d0e794 [qfcc] Implement location printing for the parsers
It's pretty bare-bones, but it's at least consistent across all the
parsers, and it's currently used only by the parser debug support.
2024-08-30 13:13:13 +09:00
Bill Currie
daaaeb9aed [qfcc] Abort qfo loading if file is too small
Or really, if Qfilesize thinks it's too small. Trying to allocate -1
bytes (due to trying to open / as a qfo) didn't end well.
2024-08-29 01:04:52 +09:00
Bill Currie
b302ce1095 [qfcc] Hook up glsl builtin variables
They get parsed, but nothing gets defined yet, but this proved to be a
good test for rua_parse_string().
2024-08-28 13:53:30 +09:00
Bill Currie
de6a3c5702 [qfcc] Support parsing Ruamoko from strings
Handy for parsing builtin symbols for things like glsl.
2024-08-28 13:50:36 +09:00
Bill Currie
4be1384701 [qfcc] Improve language selection
Using a struct with function pointers instead of switching on an enum
makes it much easier to add languages and, more importantly,
sub-languages like glsl's shader stage variants.
2024-08-28 10:18:21 +09:00
Bill Currie
bbb90ce27a [qfcc] Clone metafunc for generated generic symbols
Simply referencing the original metafunc resulted in only the first
variant getting a def. Now my little test generates defs for all called
variants of a generic function.

However, I'm still not sure this is quite the direction I want to go
with making calls to generic functions, but I still need to figure out
defining them. I think making progress with the glsl front-end will
help.
2024-08-28 09:03:56 +09:00
Bill Currie
4f5fcbd819 [qfcc] Check all generic function variants for dups
Checking only the last function to be added results in false negatives
and thus duplicates when defining a generic function. eg:

    genFType radians (genFType degrees);
    genDType radians (genDType degrees);
    genFType radians (genFType degrees) = #0;
    genDType radians (genDType degrees) = #0;
2024-08-27 14:41:38 +09:00
Bill Currie
c236129bbe [qfcc] Parse generic functions early
Detecting generic functions needs to be done before finalizing the
function type for non-generic functions, otherwise the resulting
function type winds up being incorrect due to bogus resolution of the
return type (and probably a few other factors).
This takes care of handling the return type in function definitions as
well as declarations as
2024-08-27 14:37:18 +09:00
Bill Currie
27286389d1 [qfcc] Isolate functions from symbols
Symbols now use metafunc_t to reference functions, which should make
working with generic and overloaded functions easier.
2024-08-26 15:50:27 +09:00
Bill Currie
8eae02209e [qfcc] Unify qc and c function symbol handling
This gets all the function symbol type handling into the one place,
which will make dealing with generic functions much easier.
2024-08-26 12:58:39 +09:00
Bill Currie
80df79a62f [qfcc] Be more clear about the builtin id parameter
While `expr` is better than `$n`, `bi_val` seems even better at
conveying meaning.
2024-08-26 10:31:57 +09:00
Bill Currie
3abf69cb36 [qfcc] Report errors accessing source files
This got lost in the switch to internal preprocessing as cpp used to do
the job for us.
2024-08-21 16:12:52 +09:00
Bill Currie
6a70ecda9d [qfcc] Make default_type take const symbol_t
It doesn't need to modify sym, and being const makes it more clear that
it doesn't (despite some of the other type functions breaking that rule,
ugh).
2024-08-21 08:30:15 +09:00
Bill Currie
43f83fc0eb [qfcc] Clean up some redundancy in methodproto
I don't know why I didn't apply the same ideas as in methoddef, maybe I
just forgot. I'm pretty sure I did methodproto first, or maybe cleaned
up methoddef much later then didn't think of methodproto. Still, the
grammar is much nicer to read now.
2024-08-21 08:26:31 +09:00
Bill Currie
a00b17bf71 [qfcc] Check declarator type chains
Arrays of functions or functions that return arrays or functions aren't
valid. While working on how to get generics in properly, I finally
understood what's going on with function types in the specifier, and I
think I'll be able to sort out function pointers vs prototypes, too.
2024-08-21 08:23:12 +09:00
Bill Currie
856761c4a9 [qfcc] Add to a FIXME comment 2024-08-20 20:20:05 +09:00
Bill Currie
5e6832294e [qfcc] Handle parsing generic builtin functions
Generic qc-style prototypes don't work but both c and qc style
definitions get as far as trying to build the builtin function. It
starting to look like I need to rework function handling, which isn't
all that surprising as it hasn't changed much over 22 years.
2024-08-20 15:19:31 +09:00
Bill Currie
219f2f26da [qfcc] Add is_double_val check
I wound up not using it, but I'll probably want it eventually..
2024-08-20 15:16:25 +09:00
Bill Currie
b8fe10f8a5 [qfcc] Limit builtin numbers to ints
Or whole-number floats for v6 progs.
2024-08-20 15:13:57 +09:00
Bill Currie
7f021b074c [qfcc] Treat fp constants as float for v6 progs
v6 progs don't support doubles, so demote double suffices to float, and
treat implicit fp constants as float.
2024-08-20 14:49:24 +09:00
Bill Currie
d9e2108b91 [qfcc] Return a metafunc for generic functions
One step closer to getting this idea to work.
2024-08-20 12:43:17 +09:00
Bill Currie
67c380e98d [qfcc] Clean up function.h a little
And even remove a dead function.
2024-08-20 09:26:24 +09:00
Bill Currie
0aab95eefe [qfcc] Rename overloaded_function_t to metafunc_t
I never did like overloaded_function_t as a name, and with the
introduction of generic functions (or templates, I guess?) meta-function
makes more sense to me.
2024-08-19 18:29:44 +09:00
Bill Currie
34b79ce783 [qfcc] Clean up some unnecessary type const casts
Most of them were noise from the type const correctness pass, but the
qc field function handling was always dubious (though in practice safe
due to how the type was built, but...). The remaining casts outside of
type.c need some thought.
2024-08-19 13:04:19 +09:00
Bill Currie
cdf49bb6b7 [qfprogs] Use a backup type array for qcc progs
I was investigating how qcc dealt with field fields and got segfaults
from qfprogs due to the lack of type encodings. While the resulting
output is not guaranteed to be correct (especially if trying to dump
progs compiled by some other extended compiler), at least it's better
than segfaulting or any other UB.
2024-08-17 15:16:09 +09:00
Bill Currie
9eb6aba02c [qfcc] Make the immediate union anonymous
Yay, no more annoying tags that served no real purpose (though they did
make some things a little easier, there's generally a better way).
2024-08-16 17:30:02 +09:00
Bill Currie
561f4c2ea0 [qfcc] Make the type union anonymous
This one has bothered me for a long time. I don't remember why it was
difficult at one stage, maybe I had some poor name choices.
2024-08-16 17:23:29 +09:00
Bill Currie
e5bd2591c2 [qfcc] Make the value union anonymous
Another little tag bites the dust.
2024-08-16 17:12:26 +09:00
Bill Currie
ce8c72c323 [qfcc] Make the symbol union anonymous
And now that little s. goes away. Yay, one bit less noise when reading
code.
2024-08-16 16:48:11 +09:00
Bill Currie
6bd26a0f61 [qfcc] Add some TODO items
They came up when talking about math with Darian
2024-08-12 08:51:39 +09:00
Bill Currie
e13dce882a [qfcc] Produce working calls to generic functions
There's still the problem of defining implementations, but this gets a
lot of things working so long as the return type is one of the parameter
types rather than computed.
2024-08-11 22:40:21 +09:00
Bill Currie
295d463607 [io_qfmap] File off a pile of bitrot
While much is broken, especially textures, e4m8.map successfully imports
into blender 4.2-ish, and even the entity relation lines seem to work
(which surprised me as those were the first sign of trouble).
2024-08-11 20:46:55 +09:00
Bill Currie
2cfc7a342d [qfcc] Update doc for recent lyx
And document type expressions to a certain extent. A lot of work needs
to be done as there's a lot of bitrot in the information in the doc (eg,
integer is now int, array declarations, etc).
2024-08-11 20:46:55 +09:00
Bill Currie
79c4eb531e [qfcc] Implement generic function resolution
A working call isn't produced yet, but the generic function does seem to
be selected correctly preferring a minimum of type promotions, though I
suspect I'll need to do more work on the selection process.
2024-08-11 20:46:55 +09:00
Bill Currie
cd973c6809 [qfcc] Tighten up type_promotes
Mainly to prevent promotion between different vector and matrix sizes,
but also to be consistent in that double doesn't promote to itself (same
as other scalar types). Also fix up type_rows and type_cols for matrices
and make type_assignable, type_promotes, and type_compatible null-safe
(always false if either src or dst is null).
2024-08-11 20:46:55 +09:00
Bill Currie
d0a9e1f54f [qfcc] Clean up function search a little
Still some ways to go, but this will help with implementing generic
function calls.
2024-08-11 20:46:55 +09:00
Bill Currie
66866f79b6 [qfcc] Expand @vector and @matrix type expressions
With this, genFType and genDType functions are now treated separately
and expanding to all components (single row or column matrices are not
supported (at this stage, anyway) for generic parameters).
2024-08-11 20:46:55 +09:00
Bill Currie
58bf1ee64e [qfcc] Support generic scope blocks
That is, `@generic(...) { ... };`, which is handy for bulk declarations
(such as for glsl). This proved to be a lot harder than expected, I
suspect handling of specifiers needs a lot of work.
2024-08-11 20:46:55 +09:00
Bill Currie
0d063c3290 [qfcc] Clean up specifier creation
I never did like all those cryptic parameters, especially when they were
just 0 and 1. Now the individual specifier creation functions take only
those parameters they need (if any) and there's no possibility of
conflicting parameters. Also, it's clearer what the new specifier does.
2024-08-11 20:46:55 +09:00
Bill Currie
fa3c872970 [qfcc] Add some comments about bvect and bvecp
I really need to come up with something better, but for now, just having
the terms recorded somewhere helps.
2024-08-11 20:46:55 +09:00
Bill Currie
f1afa1caf0 [qfcc] Parse generic function declarations
It doesn't properly differentiate between (treats genDType as being the
same as genFType):

    @generic(genFType=@vector(float)) genFType radians(genFType degrees);
    @generic(genDType=@vector(double)) genDType radians(genDType degrees);

but this is due to problems with how the type is built from
@vector(float) and @vector(double). However, I thought it was about time
I got some of this into git.

Also, `@generic(...) { ... };` blocks don't work properly (they lose the
generic info): need to get a little smarter about handling generic scope
in `external_def_list`.
2024-08-11 20:46:55 +09:00
Bill Currie
4c424fcb61 [qfcc] Add a check for bool types
And us it in matrix_type. Although there are no bool matrices even in
glsl, there are bool vectors and vector_type uses matrix_type.
2024-08-10 14:22:20 +09:00
Bill Currie
8fe23a29b3 [qfcc] Clean up some double semicolons
None of them really affected anything, but I have seen them cause
problems in the past.
2024-08-10 14:19:07 +09:00
Bill Currie
80e493e588 [qfcc] Parse generic function declaration
The parsed generic function declaration is for ease of matching call
signatures with the appropriate implementation.
2024-07-07 21:42:52 +09:00
Bill Currie
f2609b1a9b [qfcc] Make save_string null-safe
It simply returns nullptr when the saved string is null.
2024-07-07 15:18:51 +09:00
Bill Currie
628e3d2aed [qfcc] Make function type return type more clear
No more guessing if that's the functions return type or something else.
2024-07-07 15:17:06 +09:00
Bill Currie
c681d3ee28 [qfcc] Tidy up the doc structure a little
Talking about variables in the types section didn't make much sense.
2024-07-04 23:53:04 +09:00
Bill Currie
97e0427565 [qfcc] Ensure type expressions are resolved
Type expressions should be usable anywhere regular types can be used.
2024-07-04 23:44:07 +09:00
Bill Currie
f11f0c5477 [qfcc] Return an error expression for undefined symbols
Fixes some of the error spam that resulted from the expression
const-correctness pass a while back.
2024-07-04 23:23:06 +09:00
Bill Currie
b3fed7282e [qfcc] Make @function a type function
This fits in nicely with the rest of the generic type system and makes
it a little more useful. The idea is it will take a return type (already
does since type functions always require a parameter at this stage) and
a parameter list (not implemented yet). It currently resolves to the
basic void (...) function type for QC.
2024-05-31 16:39:50 +09:00
Bill Currie
a655e6cef3 [qfcc] Deal with generic types in prototypes
Mostly avoiding segfaults or mistreating type expressions as the default
type.
2024-05-31 13:51:38 +09:00
Bill Currie
8da8bd9917 [qfcc] Pass full specifier to function_symbol
With generic types, is_overload is no longer enough as the type
expression needs to be parsed in order to create the symbol.
2024-05-31 13:44:52 +09:00
Bill Currie
38b1d2d238 [qfcc] Clean up some bool types
It's true that true is more meaningful than 1.
2024-05-15 00:22:12 +09:00
Bill Currie
e295a62050 [qfcc] Clean up function code a little
Replace struct forward declarations and some non-locally (to use)
declared locals.
2024-05-12 12:48:50 +09:00
Bill Currie
99caaaa010 [qfcc] Remove redundant parameter
It turns out function_symbol was never called without allowing creation
of the symbol, so no need for the parameter.
2024-05-12 12:24:50 +09:00
Bill Currie
f7720a4e44 [qfcc] Preserve current function across function blocks
I'm not sure if I want to support nested functions in Ruamoko, but
handling them without segfaulting is far more important.
2024-05-05 16:46:53 +09:00
Bill Currie
b935540d19 [qfcc] Remove qc special function symbol functions
It turns out they're not needed as the difficulty of quakec function
declarations (function fields) is taken care of by qc_function_spec.
Also, they made it difficult to think about function declarations.
2024-05-04 22:08:38 +09:00
Bill Currie
28bba12e87 [qfcc] Rename some functions
One a typo, the other for better consistency.
2024-05-04 10:50:08 +09:00
Bill Currie
1567f29668 [qfcc] Handle type expressions when merging specifiers
The type expressions no longer get lost along the way to the function
return type and parameter types.
2024-05-03 19:43:58 +09:00
Bill Currie
aff70aa243 [qfcc] Support static type expressions in declarations
This allows types in declarations to be based on other types:

    int foo[3];
    @vector(float,sizeof(foo)) bar;
2024-05-03 19:37:11 +09:00
Bill Currie
fed1bce12a [qfcc] Add a function to check for error expressions
I haven't gone through and replaced all the existing tests, but hiding
the details makes sense and fits with many of the other check functions.
2024-04-30 11:16:27 +09:00
Bill Currie
f7bf77c2b7 [qfcc] Support type expressions in dot output
The graph isn't great, but it's better than invalid expression nodes.
2024-04-30 11:16:27 +09:00
Bill Currie
60730a5b12 [qfcc] Prevent dags in type expressions
While they might be ok, I expect them to cause some issues when doing
compile-time evaluations of type expressions, so use of dags seems to be
a premature optimization. However, as the "no dags" flag is propagated
to parent expression nodes, it may prove useful in other contexts.
2024-04-30 10:58:51 +09:00
Bill Currie
966275c294 [qfcc] Remove symbol field from param_t
I have no idea what it was for as nothing actually uses it.
2024-04-26 23:24:32 +09:00
Bill Currie
e8da9924c0 [qfcc] Rework type expression handling
The expression grammar has been tidied up and some basic checks are made
of parameters to the type functions. Also, type parameters are looked up
so parsing now works properly. However, the type parameters are not used
correctly, so function generation doesn't work.
2024-04-26 23:24:32 +09:00
Bill Currie
f7ed55d317 [qfcc] Use type expressions for generic types
This gets type lists and generic name references semi-implemented.
2024-04-26 07:59:21 +09:00
Bill Currie
434bcdebbb [qfcc] Add an expression type for types
No support functions yet, but this should make it easy to manipulate
type "expressions" in the parser for building generic functions.
2024-04-25 23:19:24 +09:00
Bill Currie
45d4b12e7a [qfcc] Implement generic type parsing
The semantics are only partially implemented (generic types not yet
generated), but the generic scope for function declarations seems to be
working as intended in that it gets inserted in the scope chain and
removed at the end of the declaration.
2024-04-25 16:10:43 +09:00
Bill Currie
029b8b1667 [qfcc] Implement vector_type via matrix_type
Since vectors are column matrices, this makes perfect sense and means
matrix_type always gets at least some testing.
2024-04-25 12:41:29 +09:00
Bill Currie
c70da4fc76 [qfcc] Chain matrix and bool types
Ruamoko doesn't really use either yet, but GLSL needs them and this
ironed out a lot of the issues related to adding the types.
2024-04-25 11:22:35 +09:00
Bill Currie
86b3d0db7b [qfcc] Add parameterized types to Ruamoko
The end goal is to allow generic and/or template functions, but this
allows types to be specified parametrically, eg vectors of specific type
and width, with widths of one becoming scalars.

Matrices are currently completely broken as I haven't decided on how to
represent the columns (rows is represented by width (column-major
storage)), and bools are only partially supported (need to sort out
32-bit vs 64-bit bools).
2024-04-24 15:51:29 +09:00
Bill Currie
f3d3bc8ec1 [qfcc] Implement glsl field and swizzle expressions
Ruamoko should have swizzles as well since the same underlying code is
used.
2024-04-22 11:28:13 +09:00
Bill Currie
953be00a72 [qfcc] Use appropriate result type for swizzles
Swizzles now result in a vector of the same width as the swizzle itself
rather than the source vector.
2024-04-22 11:25:10 +09:00
Bill Currie
2bc7cc3d22 [qfcc] Implement a lot of glsl's semantics
Not everything yet, but enough to get type errors in expressions (due to
swizzles not working).
2024-04-22 09:42:02 +09:00
Bill Currie
c62d14da60 [qfcc] Fix some white space 2024-04-22 09:36:47 +09:00
Bill Currie
2dd23f429a [qfcc] Implement glsl syntax
No semantics yet, but qfcc can parse some of QF's shaders. The grammar
mostly follows that in the OpenGL Shading Language, Version 4.60.7 spec,
but with a few less tokens.
2024-04-19 13:54:03 +09:00
Bill Currie
b798cb2603 [qfcc] Move qc/ruamoko keywords into qc-parse.y
This seems to be the right way to go for sharing tokenisation between
Ruamoko and GLSL, while supporting preprocessing for both.
2024-04-19 00:49:47 +09:00
Bill Currie
d1c4c59a57 [qfcc] Handle floats starting with .
eg, .25

My test scene has such a value. Obviously, I'd never compiled it on this
branch since adding PGA physics.
2024-04-18 23:52:52 +09:00
Bill Currie
95a50fefa2 [qfcc] Aggressively cancel terms
While it currently doesn't have any effect on generated code, it proved
to be necessary when experimenting with optimizing the operand of extend
expressions (which proved to produce worse code).

Along with some 0 -> nullptr changes.
2024-04-18 22:46:13 +09:00
Bill Currie
4daa84ed2a [qfcc] Force @return to be live
The change to not split basic blocks on function calls resulted in the
@return def not being live and thus getting dropped when optimizing.
Marking the def as not local forces flow and dags to treat it as global
and thus forced it to be live.
2024-04-18 22:46:13 +09:00
Bill Currie
e7930305cc [qfcc] Add a failing test case for forward return
ProxyView in qwaq's ui stopped working because of the basic block
changes for function calls.
2024-04-18 22:46:13 +09:00
Bill Currie
f390089e66 [qfcc] Treat invalid initialization as just an error
I'm not sure why I treated it as an internal error.
2024-04-18 22:46:13 +09:00
Bill Currie
5191fc26a3 [qfcc] Unify much of the qc and glsl parser interface
This gets the types such that either there is only one definition, or C
sees the same name for what is essentially the same type despite there
being multiple local definitions.
2024-04-18 12:41:24 +09:00
Bill Currie
6266ac4d94 [qfcc] Fix some debian flex incompatibilities
I need upstream flex for its line handling and nicer interface, but
debian's flex is ancient and stuck with the legacy interface, and I want
QF to be buildable on at least sid.
2024-04-18 10:34:18 +09:00
Bill Currie
2f8ffc4862 Merge branch 'master' into wip-ruaspirv 2024-04-18 09:46:10 +09:00
Bill Currie
2d362c445c [qfcc] Move keyword and directive structs
The end goal is to share the tokenisation between the C-like languages,
and maybe even Pascal.
2024-04-17 18:17:08 +09:00
Bill Currie
56f0c3f821 [qfcc] Create a parser file for GLSL
The syntax is not at all correct at this stage (really, just a copy of
Ruamoko), but the keyword table exists (in the wrong place) and the
additional basic types (bool, bvecN and (d)matNxM) have been added.
Boolean base type is currently just int, and matrices have 0 width while
I think about what to use, but finally some progress after several
months' hiatus.
2024-04-17 16:25:43 +09:00
Bill Currie
925dba732c [build] Add an option to enable ubsan
It's disabled by default because it's a runtime thing and I'm not sure I
want to keep it enabled, but it did find some issues (which I've cleaned
up), although it didn't find the problem I was looking for :P
2024-02-21 22:41:08 +09:00
Bill Currie
073c93eebf [qfcc] Don't split basic blocks on function calls
This allows the dags code to optimize the return values, and when I make
the node killing by function calls less aggressive, should make for many
more potential CSE optimizations.
2024-02-21 22:41:08 +09:00
Bill Currie
03b2ee2a25 [qfcc] Delay creation of leaf nodes
Creating leaf nodes early gets in the way of supporting multi-call basic
blocks, and never really seemed right anyway.
2024-02-21 22:41:08 +09:00
Bill Currie
6d6a387a81 [qfcc] Treat move the same as assign in dags
This goes a long way towards allowing basic blocks to include multiple
function calls instead of always ending on a call.
2024-02-21 22:41:08 +09:00
Bill Currie
277feaeb03 [qfcc] Support multivector expression to/from functions
The multivector is first assigned to a temporary then passed or returned
as usual.
2024-02-21 22:41:08 +09:00
Bill Currie
389571cbbe [qfcc] Handle pointer dereferences in offset casts
Offset casts are used heavily in geometric algebra, but doing an offset
cast on a dereferenced pointer (array index) doesn't work well for
assignments. Fixes yet another bug in my test scene :)
2024-02-21 22:41:08 +09:00
Bill Currie
62221b2735 [qfcc] Set the source location for compound init elements
Finally, less bouncing to the compound initializer's closing brace line.
2024-02-21 22:41:08 +09:00
Bill Currie
2be9821a59 [qfcc] Use statement aux def if def not in operands
This takes care of ptrmove instructions, fixing the printf problem in
ptrstructinit. It might even make it possible to not break basic blocks
on function calls, which should make for some more optimization
opportunities, but that can come later.

For this to work properly, it was necessary to avoid converting alias
defs to st_alias nodes.

It also fixes ptrstructinit itself (at first, I hadn't noticed that the
test passed entirely).
2024-02-21 22:41:08 +09:00
Bill Currie
07ef862c52 [qfcc] Put problematic printf into ptrstructinit
It turns out the bug I was chasing in set_poses was not the data getting
lost or incorrect data being read, but the arguments to printf being set
from the parent pose `p` before `p` had actually been set.
2024-02-21 22:41:08 +09:00
Bill Currie
00781160e2 [qfcc] Remove the node from its own edges
This gets rid of the funny little self-loop edge in dags dot files that
has bothered me for a while. It was just because the node to which an
identifier was attached happened to be the parent of the identifier's
leaf node.
2024-02-21 22:41:08 +09:00
Bill Currie
b842913ca9 [qfcc] Remove special treatment for flow/func statements
The fix in bdafdad0d5 for
`while (count--)` never did appeal to me. I think I understood the core
problem at the time, but I hadn't figured out how to use a var's
use/define sets to detect the write-before-read. Using them allows the
special handling for flow control to be removed, making things more
robust. The function call handling has been superfluous since the
Ruamoko instruction set required the auxiliary operands on the call
statements.
2024-02-21 22:41:08 +09:00
Bill Currie
1fb4a556d7 [qfcc] Remove old ptrmove code from dag creation
It doesn't seem to help any, and removing it doesn't break anything
(that is tested), and I'm working on better handling of ptrmove support.
2024-02-21 22:41:08 +09:00
Bill Currie
9a38cdfd78 [qfcc] Clean up dag item counting and init
Not by much really, but using one "aux" count instead of different
types, and using functions to iterate through the statement's aux
operands makes the code easier to read.
2024-02-21 22:41:08 +09:00
Bill Currie
768113d37b [qfcc] Replace expr_file_line with a scoped version
Two birds with one stone: eliminates most of the problems with going
const-correct with expr_t, and it make dealing with internally generated
expressions at random locations much easier as the set source location
affects all new expressions created within that scope, to any depth.
Debug output is much easier to read now.
2024-02-21 22:41:08 +09:00
Bill Currie
6e8c98433a [qfcc] Fix a missed const type_t 2024-02-21 22:41:08 +09:00
Bill Currie
b9aad99381 [qfcc] Clean up warning and notice return types
They never needed to return expr.
2024-02-21 22:41:08 +09:00
Bill Currie
131ad9013c [qfcc] Tidy up expr_assign_copy a little
It proved that expr_assign_copy wasn't the cause of any problems, but I
cleaned up some of its types a little.
2024-02-21 22:41:08 +09:00
Bill Currie
35e2044bfa [qfcc] Fix nested compound initializers
Add static array indexing. This gets the compoundinit test working.
2024-02-21 22:41:08 +09:00
Bill Currie
19965e7cbd [qfcc] Add a failing test case for compound initializers
It turns out that compound intializers break on when the nesting level
increases (eg, initializing vectors in structs in arrays).
2024-02-21 22:41:08 +09:00
Bill Currie
1b4db639af [qfcc] Handle quaternion (in)equality tests
I'm surprised this didn't come up earlier.
2024-02-21 22:41:08 +09:00
Bill Currie
0e7c80e9fe [qfcc] Use ud-chains for ptrmove pointer analysis
ptrmove was not treating its indirect source operand as used because the
pointer wasn't checked for its source.

This fixes part of ptrstructinit, but there's a lot more breakage in
that test: it looks like all sorts of fun with arrays.
2024-02-21 22:41:08 +09:00
Bill Currie
ab69e65e02 [qfcc] Add failing test case for pointer struct initialization 2024-02-21 22:41:08 +09:00
Bill Currie
3a22091455 [qfcc] add pointer validity check function to test-harness 2024-02-21 22:41:08 +09:00
Bill Currie
192eb11235 [qfcc] Dereference most array types properly
This should prevent some fun bugs in the future (it's what necessitated
the const-correct patch).
2024-02-20 16:47:06 +09:00
Bill Currie
f0dfe47a32 [qfcc] Make type_t mostly const-correct
There were a few places where some const-casts were needed, but they're
localized to code that's supposed to manipulate types (but I do want to
come up with something to clean that up).
2024-02-20 16:47:04 +09:00
Bill Currie
6e71aadfa4 [qfcc] Use dereference_type for initialized arrays
In particular, when the size is inferred from the compound initializer.
Fixes a fun "incomplete type" error.
2024-02-20 16:46:02 +09:00
Bill Currie
fa5c3ab12e [qfcc] Support arrays in dereference_type
This is needed to get the correct type from arrays of typedefed
elements.
2024-02-20 16:46:02 +09:00
Bill Currie
827ca3cf27 [qfcc] Make array_type const-correct
As such... need to cast away the const when calling append_type (which
should probably become internal).
2024-02-20 16:46:02 +09:00
Bill Currie
3d26aafbea [qfcc] Unalias def ops too
When I implemented the st_alias handing (d8a78fc849) I was
unsure if I needed to unalias aliased defs too, but it turns out to have
been necessary: this is what caused my 2d PGA dynamics test to blow up
strangely due to the GA vector loaded from an array into a local
variable getting the local var replaced by a temp but the var itself
being read later in the code (uninitialized variable due to incorrect
optimization... oops).
2024-02-20 16:46:02 +09:00
Bill Currie
37fe0bc4ed [qfcc] Fix some 2d PGA bugs
When sum_expr gets a null expression as one of its args, it simply
returns the other arg, but that arg needs to have the correct type
applied.

Handle zero (null result) cross product in bivector geometric product.

Clean up types in bivector * vector geometric product.
2024-02-20 16:46:02 +09:00
Bill Currie
946211bca2 [qfcc] Use a better name for a var
Looking at the code afterwards, I realized flips would be a far better
name than mask. Not sure what I was thinking when I wrote the code.
2024-02-20 16:46:02 +09:00
Bill Currie
40f04ff33e [qfcc] Implement undual and use for regressive product
I'm not sure the regressive product is right (overall sign), but that's
actually partly a problem in the math itself (duals and the regressive
product still get poked at, so it may be just a matter of
interpretation).
2024-02-20 16:46:02 +09:00
Bill Currie
10861986fb [qfcc] Add tests for the hodge dual 2024-02-20 16:46:02 +09:00
Bill Currie
d319ce6106 [qfcc] Support multi-vector comparison
I'm not sure anything other than == or != has much meaning on anything
but scalars and pseudo scalars, but all comparisons are supported as a
simple boolean test. Any missing components are assumed to be 0. If
nothing else, it makes unit tests easier to write.
2024-02-20 16:46:02 +09:00
Bill Currie
11b247918e [qfcc] Find current algebra context for duals
Now finding the dual of a scalar works, too (need a context as otherwise
the pseudo-scalar is unknown).
2024-02-20 16:45:55 +09:00
Bill Currie
e56b4a3a6d [qfcc] Strip off algebra types internally
It turns out the algebra types make expression dag creation much more
difficult resulting in missed optimizations (eg, recognizing `a × a`).
This fixes the dead cross products in `⋆(s.B × ⋆s.B)`
2024-02-08 13:56:59 +09:00
Bill Currie
cf756eb1a0 [qfcc] Emit statements for expressions only once
The switch to using expression dags instead of trees meant that the
statement generator could traverse sub-expressions multiple times. This
is inefficient but usually ok if there are no side effects. However,
side effects and branches (usually from ?:, due to labels) break: side
effects happen more than once, and labels get emitted multiple times
resulting in orphaned statement blocks (and, in the end, uninitialized
temporaries).
2024-02-08 13:56:59 +09:00
Bill Currie
701b0f3992 [qfcc] Print block label expressions first
Just running through the list of expressions in a block expression
results in label expressions within the block getting printed by
expressions that reference them and thus don't receive the correct next
pointer and wind up pointing to themselves. Printing the labels first
ensures they have the correct next pointer. However, I suspect there are
other ways things will get tangled.
2024-02-08 13:56:59 +09:00
Bill Currie
5fef8e6edb [qfcc] Implement quaternion multiplication
I'm surprised it took almost two years to discover that I had no
quaternion multiplications in any test code, but getting an ICE for a
quaternion-vector product, and the Hadamard product for
quaternion-quaternion was a bit of a nasty surprise.
2024-02-01 11:00:27 +09:00
Bill Currie
8994042a47 [qfcc] Support expanding constant expressions
This makes a slight improvement to the commutator product in that it
removes the expand statement, but there's still the problem of (a+a)/2.
However, at least now the product is correct and slightly less abysmal.
2024-01-19 15:36:47 +09:00
Bill Currie
aa9be53b6e [qfcc] Include divide by two in commutator product
I had forgotten this, and of course didn't have any tests.
2024-01-19 15:26:18 +09:00
Bill Currie
5c22ba118c [qfcc] Support aliasing constants
This takes advantage of evaluate_constexpr to do all the work. Necessary
for use of basis blade constants in algebra contexts (avoids an internal
error).
2024-01-18 13:08:21 +09:00
Bill Currie
0ed4df3fb9 [quakeio] Rework Qgetline to use dstring
This clears up its stray memory allocation, and incidentally makes it
thread-safe.
2024-01-05 11:50:48 +09:00
Bill Currie
bfa7c1722a [build] Implement tracy memory zones
This proved to be quite the challenge, and is probably rather fragile,
but it does seem to work, and might help with tracking down memory
leaks.
2024-01-05 11:50:48 +09:00
Bill Currie
18c0ea3657 [qfcc] Ensure one is the correct type for incop expressions
This makes for nicer generated code when the incop (especially post) is
used in a condition.
2023-12-20 23:10:17 +09:00
Bill Currie
dd183d3ba6 [qfcc] Handle signed-unsigned int comparison better
This fixes the upostop-- test by auto-casting implicit constants to
unsigned (and it gives a warning for signed-unsigned comparisons
otherwise). The generated code isn't quite the best, but the fix for
that is next.

Also clean up the resulting mess, though not properly. There are a few
bogus warnings, and the legit ones could do with a review.
2023-12-20 23:09:06 +09:00
Bill Currie
54839db826 [qfcc] Add some tests for postop--
Interestingly, intval-- works properly, but unsignedval-- does not (test
case fails). This is why menus blow up when opening the load/save
sub-menu.
2023-12-20 21:50:51 +09:00
Bill Currie
dd4f51049d [build] Fix up unwanted dependency on tracy source
The tracy source files should not be required for make dist to work, so
this works around it by using a little indirection.
2023-12-17 19:18:58 +09:00
Bill Currie
9c3f0bc5d4 [build] Fix some release script issues
Set sharepath correctly and the menu is not gzipped any more.
2023-11-25 15:45:25 +09:00
Bill Currie
f58a14c2d3 [build] Disable 32-bit win32 in release build script
32-bit Windows isn't relevant enough any more. Anybody that wants 32-bit
windows QuakeForge can go through the pain.
2023-11-24 12:29:39 +09:00
Bill Currie
f3a428fbdd Fix up windows and the release scripts
I really need more feedback and the best way to get that is to have more
users, and for that, I need packages.
2023-11-23 20:28:19 +09:00
Bill Currie
c9cfd9e8cf Fix window build for recent config changes
And, more importantly get curl working in the mxe build.
2023-11-23 17:16:53 +09:00
Bill Currie
65bf3ab459 [qfcc] Switch to using the internal preprocessor
It's actually good enough for building qfcc: it fails a couple of
obscure c23 preprocessor examples that can be ignored for now (the rest
of QF builds without any apparent issue).
2023-11-23 13:33:44 +09:00
Bill Currie
2fd2a7086f [qfcc] Save disabled preproc expression debug 2023-11-23 13:33:12 +09:00
Bill Currie
5e02716a01 [qfcc] Save force-expanding function-type arg macros
The expansion is necessary for the final test in preproc-2.r, but breaks
preproc-1.r because the closing ')' is *not* visible to collect_args
(its assumption is incorrect). This needs reworking (and probably
rethinking) of the entire macro argument collection, but I need a little
break from the preprocessor (and it's good enough for *most* uses), so
I'm adding the code (disabled) in order to avoid losing it and my notes
about the problem.
2023-11-23 13:28:48 +09:00
Bill Currie
4480453861 [qfcc] Fail function-type macro expansion early
That is, if anything other than '(' (even a macro/argument that expands
to '(')is seen while checking for a function-type macro, the expansion
fails. This gets preproc-1.r working properly.
2023-11-23 13:26:02 +09:00
Bill Currie
4ed25ed616 [qfcc] Correct some misuses of scanner
It really affected only collect_args, but in fixing that I noticed I was
very inconsistent with scanner's type (should be yyscan_t or void *, but
not yyscan_t *).
2023-11-22 11:54:14 +09:00