Jack Palevich
2ff5c22e96
Keep track of the current arena.
...
This means we don't have to pass it around as an argument.
This change was made because I'm about to start creating pointer types
during expression evaluation, and I didn't want to add an arena
argument to all the expression functions.
2009-07-23 15:11:22 -07:00
Jack Palevich
89baa2083f
Fix the ARM postdecrement operator.
...
Add a test for ++ and -- so this bug won't happen again.
2009-07-23 11:45:15 -07:00
Jack Palevich
58c30eef99
Code generator cleanup
...
Factor ARM integer binary operation setup code into a function.
Don't pass redundant pType information into loadR0FromR0, storeR0ToTOS,
gcmp, gUnaryCmp, li
Separate inc/dec from variable loading. Generates worse code, but now
we handle pointer inc/dec and char inc/dec.
2009-07-17 16:35:23 -07:00
Jack Palevich
b40367bde1
Remove unused logging code.
2009-07-17 13:51:51 -07:00
Jack Palevich
ba929a4ffa
Track lvalues vs. rvalues.
2009-07-17 10:20:32 -07:00
Jack Palevich
3377bfd845
Report error (rather than crashing) when a declaration name is missing.
...
Repo case:
void main()
{
int );
}
2009-07-16 19:05:07 -07:00
Jack Palevich
8148c5be54
Coerce R0 to destination type before storing it into a variable.
2009-07-16 18:24:47 -07:00
Jack Palevich
dc45646238
Implement a "#line" directive.
2009-07-16 16:50:56 -07:00
Jack Palevich
b1544cad42
Detect assignments to undeclared variables.
...
Previously we only detected reading from undefined variables.
2009-07-16 15:09:20 -07:00
Jack Palevich
ce105a9082
If the compile failed, return NULL from symbol lookups.
2009-07-16 14:30:33 -07:00
Jack Palevich
d1f57e689b
Improve error handling
...
Don't segfault if the right-hand operand of a binary operator is missing.
Don't segfault if a semicolon is missing at the end of a forward
declaration.
2009-07-15 18:23:22 -07:00
Jack Palevich
2aaf21f1be
Improve numerical constant parsing.
2009-07-15 16:16:37 -07:00
Jack Palevich
8c246a9dc2
Add accRegisterSymbolCallback API to control external symbol linkage.
...
Until now dlsym was used to lookup external symbols. Now you can
register your own function to be called when an undefined symbol is
used.
2009-07-14 21:14:10 -07:00
Jack Palevich
fd3db48e2e
Add test for passing floats and doubles as ints, floats, and doubles.
2009-07-14 19:39:36 -07:00
Jack Palevich
37c54bd22e
Make forward declarations of external symbols really work.
...
Until now we had always been treating external variables as "int",
and external functions as int (...);
2009-07-14 18:35:36 -07:00
Jack Palevich
7ecc5556ae
Remove unused variable.
2009-07-14 16:24:55 -07:00
Jack Palevich
a8f427f606
Implement pointer arithmetic.
2009-07-13 18:40:08 -07:00
Jack Palevich
25c0ccaed4
Implement support for "char" local and global variables.
2009-07-13 16:56:28 -07:00
Jack Palevich
45431bc252
Implement general casts and pointer dereferencing.
...
Prior to this casts and pointer dereferencing were special-cased.
2009-07-13 15:57:26 -07:00
Jack Palevich
59178c0a3d
Run tests on both ARM and x86
2009-07-13 14:15:18 -07:00
Jack Palevich
b7718b973c
Implement floating point for ARM.
2009-07-09 22:00:24 -07:00
Jack Palevich
bab8064203
Add x86 floating point test.
2009-07-09 13:54:54 -07:00
Jack Palevich
2a4e1a9f88
Finish implementing x86 floating point
...
Support floating-point if/while statements: if(1.0) { ... }
Support reading values from float and double pointers.
And some additional error checking.
Detect malformed "return" statements
Detect passing the results of "void" functions as arguments.
2009-07-09 13:34:25 -07:00
Jack Palevich
a39749f641
Implement x86 floating point operations
...
+ unary floating point operation -
+ unary floating point compare: !
+ binary floating point operations +-*/
+ binary floating point comparisons: < <= == != >= >
2009-07-08 20:40:31 -07:00
Marco Nelissen
eea5ae9ceb
Class with virtual methods should have virtual destructors too.
2009-07-08 17:43:17 -07:00
Jack Palevich
9cbd226960
Implement global, local, and stack based float and double variables.
2009-07-08 16:48:41 -07:00
Jack Palevich
128ad2d204
Implement x86 int <--> float.
2009-07-08 14:51:31 -07:00
Jack Palevich
1a539db23c
Some x86 floating point code works.
...
We now check the types and number of arguments to a function.
2009-07-08 13:04:41 -07:00
Jack Palevich
8df4619e09
Start tracking types in expressions.
2009-07-07 14:48:51 -07:00
Jack Palevich
1aeb87b52b
Parse floating point (and double) constants.
2009-07-06 18:33:20 -07:00
Jack Palevich
9eed7a2c7b
Start teaching the code generator about types.
...
Remove the concept of "R1" from the code generator API, R1 is used
internally as needed.
2009-07-06 17:24:34 -07:00
Jack Palevich
95727a0b05
Initial support for float, double.
2009-07-06 12:07:15 -07:00
Jack Palevich
3f22649d98
Implement our hard casts using our type system.
...
Doesn't add any new capabilities, but we now generate error
messages if you attempt casts we don't support,
and we also found and fixed some bugs in declaration parsing.
2009-07-02 14:46:19 -07:00
Jack Palevich
40600de143
Clean up expression code.
...
Concatenate adjacent string literals.
2009-07-01 15:32:35 -07:00
Jack Palevich
8635198c57
Add a type system.
...
We now track the declared type of variables and functions.
2009-06-30 18:09:56 -07:00
Jack Palevich
569f135862
Implement a token table and an arena allocator.
...
+ Tokens are now simple IDs, rather than ids or maybe pointers.
+ We can now allocate data that's freed automatically when
compilation end or when a block goes out of scope.
+ Renamed our Array utility class to Vector, and made its
api work a little more like the STL vector template class.
2009-06-30 10:16:43 -07:00
Jack Palevich
609c994f7b
Rewrite compiler test using python.
...
Nice because we're now checking the output for success/failure
automatically rather than by eye.
2009-06-25 13:55:12 -07:00
-b master
422972cb12
Align ARM stack pointer to an 8-byte boundary when calling functions.
...
This is required by the ARM EABI standard.
2009-06-17 19:13:52 -07:00
Jack Palevich
a1804ddeba
Allow local variables to be declared anywhere in a block.
2009-06-12 14:40:04 -07:00
Jack Palevich
d7461a7342
Support variable initialization.
...
Global variables can only be initialized to integer constants.
Local variables can be initialized to arbitrary expressions.
2009-06-12 14:26:58 -07:00
Jack Palevich
f1728bec74
Reserve all C99 keywords.
...
And improve checks/error messages around using non-symbols where a
symbol is expected.
2009-06-12 13:53:51 -07:00
Jack Palevich
22e3e8e1a6
Handle end-of-file inside of comments, local declarations.
2009-06-12 13:12:55 -07:00
Jack Palevich
b4758ff1de
Implement string and character backslash constants.
...
Until now we only supported '\n'. Now we support everything, including
octal ('\033') and hex '\x27' constants.
2009-06-12 12:49:14 -07:00
Jack Palevich
2ccc40d096
Make #define work again. (Had accidentally omitted the keyword.)
2009-06-12 11:53:07 -07:00
Jack Palevich
a6baa23f08
Improve symbol-related error checking
...
+ Duplicate symbols.
+ Undefined variables;
+ Forward-referenced functions that were never defined.
2009-06-12 11:25:59 -07:00
Jack Palevich
61d22dc763
Improve nested variable test.
...
Test that we can have two levels of local variables.
2009-06-11 22:03:24 -07:00
Jack Palevich
b67b18f7c2
Add code generator tracer.
2009-06-11 21:50:17 -07:00
Jack Palevich
303d8ffca9
Improve local variable scoping.
...
Until now we faked local variables -- they only worked correctly if
there was no overlap between local variables and global variables.
Use a symbol table stack instead of a string list.
Fix bug with looking up undefined symbols.
2009-06-11 21:47:57 -07:00
Jack Palevich
2db168f12f
Use a separate table for keywords.
2009-06-11 14:29:47 -07:00
Jack Palevich
0a280a0dde
Remove use of setjmp/longjmp from libacc compiler.
...
It makes it harder to deal with memory allocation.
Also fix bug in the otcc-ansi.c test, where the wrong part of the
code buffer was being mprotected, so that if the code buffer happened
to be allocated across a page boundary, some code would no receive
execute permission.
2009-06-11 10:53:51 -07:00