Commit Graph

3028 Commits

Author SHA1 Message Date
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