aboutsummaryrefslogtreecommitdiff
path: root/test
AgeCommit message (Collapse)Author
2021-12-06decl: Fix typedefs with type qualifiersMichael Forney
Previously, the qualifiers were saved, but accidentally ignored when the typedef was referenced.
2021-12-06decl: Use strictest alignment when multiple specifiers are presentMichael Forney
This is specified by the last sentence in C11 6.7.5p6.
2021-10-25decl: Allow alignment > 16 of localsMichael Forney
This is not yet supported by QBE, so for now we allocate a bit extra and choose the address in the allocated region with an aligned address.
2021-10-25decl: Allow alignment > 16 of globals and struct membersMichael Forney
2021-10-25eval: Fix int-to-float conversionsMichael Forney
Also, add bounds checks for float-to-int conversions. If the integer part can't be represented in the result type, C behavior is undefined. Although this means the result is arbitrary, we need to avoid undefined behavior in cproc itself when given such a program as input.
2021-10-25qbe: Use ... to separate named and variadic argumentsMichael Forney
This requires a not-yet-upstream QBE patch, and is needed for riscv64 support, since the calling convention may be different depending on whether the argument is named or variadic.
2021-10-21expr: Add support for UTF-8 character constantsMichael Forney
2021-10-21expr: Implement binary integer constantsMichael Forney
These are in the latest C23 draft.
2021-10-20expr: Fix octal escapes followed by octal digitsMichael Forney
2021-10-20expr: Add support for wide string literalsMichael Forney
Thanks to Nihal Jere for his initial patches implementing this feature. Fixes #35.
2021-10-18expr: Make sure __builtin_va_end argument is evaluated for side-effectsMichael Forney
2021-10-18qbe: Fix jnz controlled by short/char typeMichael Forney
Although we don't need the cnew in this case, we still need to do the appropriate extension to 32-bit.
2021-10-02qbe: Re-add conversion to bool RHS of logical and/orMichael Forney
7e838669 removed conversion to bool for int expressions used only to control jnz, but incorrectly dropped the conversion for the right-hand-side of logical and/or as well. We need the result of the expression to be 0 or 1, so we still need that conversion.
2021-09-29eval: Allow subtraction in address constantsMichael Forney
2021-09-28expr: Skip codegen for unused expression in conditional with constant expressionMichael Forney
This compiles `0 ? e1 : e2` as `e2`, and `1 ? e1 : e2` as `e1` (while still adjusting the type as necessary).
2021-09-28Skip unnecessary conversion to bool for logical and conditional expressionsMichael Forney
As in ede6a5c9, if an expression is used only to control a jnz, we don't need to convert it to a 0 or 1 value. QBE ignores the upper 32-bits of the argument to jnz, so the conversion is still needed for pointer, long, and floating point types (including float since -0 has non-zero bit representation).
2021-09-14qbe: Fix temporary type for < 8 byte aligned struct copiesMichael Forney
2021-09-13Add test for string concatenation corner caseMichael Forney
2021-09-07expr: Fix varargs again and add more testsMichael Forney
2021-09-06Add tests for char/wchar_t signednessMichael Forney
2021-09-04Use architecture-specific va_list typeMichael Forney
Previously, cproc effectively used used typedef struct { /* 32 bytes, 8-byte aligned */ } __builtin_va_list[1]; However, this is not quite correct for x86_64 nor aarch64, though it was close enough for both to work in most cases. In actuality, for x86_64 we want typedef struct { /* 24 bytes, 8-byte aligned */ } __builtin_va_list[1]; and for aarch64 we want typedef struct { /* 32 bytes, 8-byte aligned */ } __builtin_va_list; The difference only appears when the size of va_list matters, or when va_list is passed as a parameter. However, the former is not often the case, and the aarch64 ABI replaces aggregate arguments with pointers to caller-allocated memory, which is quite similar to arrays decaying to pointers in C except that the struct is not copied. Additionally, riscv64 simply uses typedef void *__builtin_va_list; which again has a different size and calling convention. To fix this, make the __builtin_va_list type architecture-specific and use architecture-specific tests for varargs-related functionality.
2021-07-05qbe: Fix bitfield sign extension with types shorter than intMichael Forney
2021-07-02qbe: Remove more unnecessary copy instructionsMichael Forney
Now that we don't track QBE types within values, we don't have to worry about generating incorrect SSA when passing an 'l' value to a function taking a 'w'. So we can just return the source value instead of emitting a dummy copy instruction.
2021-07-01qbe: Remove unnecessary distinction between loaduw and loadswMichael Forney
We always store the result to a w temporary, so there is no difference. In fact, QBE provides loadw as an alias for loadsw precisely for this reason.
2021-07-01decl: Disallow members with incomplete typesMichael Forney
Make an exception for flexible array members, though we should also check that the flexible array member, if any, is last.
2021-06-30stmt: Check that controlling expression is a scalar, and drop unneeded ↵Michael Forney
conversion The conversion is only needed for floating types. QBE isn't able to optimize it away for integer types yet, so removing this unnecessary conversion has a substantial performance benefit.
2021-06-30qbe: Remove before unnecessary adds during copyMichael Forney
2021-05-02expr: Include NUL-terminator in string expression dataMichael Forney
This will facilitate the support of wide-string literals. Based on patch from Nihal Jere.
2021-04-22Update test for DBL_DECIMAL_DIGMichael Forney
2021-04-11Check in static-assert-struct test expected outputMichael Forney
2021-04-11decl: Allow _Static_assert in struct declarationMichael Forney
2021-04-11decl: Allow _Alignas(0)Michael Forney
C11 6.7.5p6 says "An alignment specification of zero has no effect".
2021-04-08qbe: Remove unnecessary value copy for struct/union typesMichael Forney
Previously, this was needed so that an aggregate type value was updated to be an 'l' type value. However, since 5ff1d2fa the aggregate type name is stored in a separate parameter in IARG/ICALL instructions, so we can just re-use the same pointer value.
2021-03-31qbe: Switch to fixed-size instruction structMichael Forney
Move jump and phi instructions to struct block, and function arguments to their own instruction. This will facilitate allocating instructions as an array.
2021-03-30Add struct passing call testMichael Forney
The struct-passing test checks for function definitions with struct arguments, but we were missing a test for function calls with struct arguments.
2020-05-24qbe: Omit unnecessary add to help QBE's memopt passMichael Forney
2020-04-04expr: Fix type of '&' operator applied to arrayMichael Forney
It should be a pointer to the array, not to the first element (as it would after implicit conversion without the '&' operator).
2020-03-22pp: Don't add leading space for first stringized tokenMichael Forney
2020-03-22pp: Implement variadic macrosMichael Forney
2020-03-18pp: Add test for function-like macro with no argument tokensMichael Forney
2020-03-18pp: Finish '#' operatorMichael Forney
2020-03-17pp: Fix some whitespace after preprocessingMichael Forney
2020-03-17pp: Add support for macro definition and expansionMichael Forney
The token pasting operator `##` still needs to be implemented.
2020-01-31eval: Allow casting address constants to integer types in constant expressionsMichael Forney
2020-01-30Add test for sizeof string literalMichael Forney
This was regressed in d889bc80be and fixed in 090e2932ce.
2020-01-30decl: Better check for inline definitionsMichael Forney
2019-08-13Remove test corresponding to cast-same-type.qbeMichael Forney
This should have been removed when "expr: Fix cast of same type" was reverted in 0d1969024c.
2019-08-12Revert "expr: Fix cast of same type"Michael Forney
This reverts commit 1a38a5fc4844a0de8729be694a62ba0afce3ff52. This breaks comparisons bitfields in some cases, for instance extern struct {unsigned x:31;} s; int main(void) { return (unsigned)s.x - 1 < 0; } If we discard the cast, then it is a signed comparison because of integer promotion for bit-fields, otherwise it is an unsigned comparison. Additionally, the test case this was meant to fix is not actually ISO C, since casts must be to scalar types or `void`.
2019-08-11decl: Allow enumerator values up to UINT_MAXMichael Forney
2019-07-11expr: Fix cast of same typeMichael Forney