Commit graph

1951 commits

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