Commit Graph

35 Commits

Author SHA1 Message Date
Jack Palevich c951c59232 Add support for the continue statement
Add error check for a break statement that's not inside a loop. (We just
generated bad code before. Oops!)
2009-10-29 15:04:27 -07:00
Jack Palevich ee1f829dd4 Implement typedef. 2009-10-28 16:10:17 -07:00
Jack Palevich 188a5a7a3a Support nested macros. (Still don't support macro arguments.)
Now you can say:

    #define A B
    #define B C
    #define C 4

int x = A;

And it will work as expected.

Print an error message rather than assert when we're expecting a
function value, but don't find one.
2009-10-27 17:23:20 -07:00
Jack Palevich 5fd66ae01e Improve address operator (unary &).
Until now the address operator only worked with simple variables.
Now it works with arbitrary expressions (that are lvalues or function
names). So for example this now works:

struct S { int a[10]};

int f(struct S* p) {
    return &p->a[3];
}
2009-09-04 15:24:23 -07:00
Jack Palevich 9221bcccb3 Preliminary struct and union support.
Working features:
 - struct
 - union
 - nested structs
 - anonymous structs
 - forward declarations
 - '.' and '->'
 - copying structs using '='

Missing features:
 - passing structs by value
 - returning structs by value
 - typedef
 - sizeof

Example:

struct v {float x, y, z, w; };

void add(struct v* result, struct v* a, struct v* b) {
    result->x = a->x + b->x;
    result->y = a->y + b->y;
    result->z = a->z + b->z;
    result->w = a->w + b->w;
}

Reworked size-of and alignment logic to support structs.

Improved encoding of ARM immediate constants.
2009-08-26 16:15:07 -07:00
Jack Palevich c0f253359f Make pointer casting work. 2009-08-25 12:23:43 -07:00
Jack Palevich 0f400c59b8 Add runtime check for whether or not the OTCC-output tests can be run.
This means we don't have to manually specify the --norunotcc flag.
2009-08-25 11:57:13 -07:00
Jack Palevich d3abe3c40d Add a --nox86 flag to allow disabling x86 tests
The x86 tests don't work on non-Linux systems.
2009-08-19 11:12:56 -07:00
Jack Palevich 0a01a5db56 Handle functions with anonymous arguments
Example:

int f(int a, int, int c) {
    return a + c;
}
2009-08-19 10:53:43 -07:00
Jack Palevich 0b2de0de64 Allow parenthesized expressions as the value of defines
For example, this now works:

#define A (1 + 2)

Note that we still don't support defines with argument lists, so this is
still illegal:

#define A(X) (X + 2)

Also in this change: The compiler test script allows command-line
arguments to disable testing on ARM and to disable testing the output
of the old OTCC compiler.

Disabling testing on ARM is handy for developing front-end code when no
device or emulator is available.

Disabling testing OTCC output is handy for some 64-bit Linux environments,
because the original OTCC needs some tweaking to be fully compatible, and
I don't have time to investigate this problem right now.
2009-08-18 16:04:03 -07:00
Jack Palevich 80e4972625 Support 2D arrays. 2009-08-04 15:39:49 -07:00
Jack Palevich b61545096d Implement arrays.
Added check to see that pointer types are compatible when passing function
arguments.
2009-08-04 14:56:09 -07:00
Jack Palevich c9b8ffc389 Add support for "short" data type. 2009-08-03 14:42:57 -07:00
Jack Palevich 96138992ac Fix parsing of function declarations that return pointers.
Check that <op>= only evaluates the left-hand-side once.
2009-07-31 15:58:19 -07:00
Jack Palevich 47cbea9c69 Support brackets for accessing array values.
Don't yet support allocating arrays.
2009-07-31 15:25:53 -07:00
Jack Palevich aaac9284b4 Implement pre-increment / pre-decrement 2009-07-31 14:34:34 -07:00
Jack Palevich 43aaee31b9 Support the comma operator. 2009-07-31 14:01:37 -07:00
Jack Palevich 0c01774816 Implement op=. 2009-07-31 12:00:39 -07:00
Jack Palevich beb4fe95a0 Test multiple levels of pointer indirection. 2009-07-31 11:27:29 -07:00
Jack Palevich 8f361faffc Fix bad ARM code generation for '||' and '&&' operators.
Add tests of '&', '&&', '|' and '||' operators.
2009-07-30 16:19:43 -07:00
Jack Palevich 9f51a26961 Load function symbols using lea syntax.
Use a common code path for ordinary, forward, and indirect calls.
2009-07-29 16:22:26 -07:00
Jack Palevich ddf7c9c141 Implement inc/dec in a more lval-friendly way. 2009-07-29 10:28:18 -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 8148c5be54 Coerce R0 to destination type before storing it into a variable. 2009-07-16 18:24:47 -07:00
Jack Palevich 2aaf21f1be Improve numerical constant parsing. 2009-07-15 16:16:37 -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 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 40600de143 Clean up expression code.
Concatenate adjacent string literals.
2009-07-01 15:32:35 -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