aboutsummaryrefslogtreecommitdiff
path: root/test
AgeCommit message (Collapse)Author
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
2019-07-10decl: Display message when _Static_assert failsMichael Forney
2019-07-07type: Ignore parameter qualifiers when determining type compatibilityMichael Forney
The end of C11 6.7.6.3p15 says that qualifiers should be ignored when checking compatibility of function types.
2019-07-05qbe: Handle K&R function definition argument promotionMichael Forney
Parameters for K&R function definitions that are affected by default argument promotion are passed as their promoted type, so need to be converted back before storing into memory allocated for the parameter.
2019-07-05stmt: Fix conversion of controlling expression to boolMichael Forney
In d875bf74, I accidentally converted the increment expression to bool rather than the controlling expression. Whoops, I should check the updated test case IL more carefully next time.
2019-07-03Implement no-op __builtin_expectMichael Forney
2019-07-03Convert controlling expression of loops to boolMichael Forney
2019-06-27qbe: Fix switch statements with 64-bit controlling expressionMichael Forney
2019-06-04Fix non-adjacent bit-fieldsMichael Forney
2019-05-29Temporarily avoid %a when printing floating constantsMichael Forney
This is C99, but is not supported by fscanf in OpenBSD, so floating constants can't be read back in by QBE.
2019-05-16Fix test after amend to 52bf506Michael Forney
2019-05-16stmt: continue in do-loop should evaluate controlling expressionMichael Forney
2019-05-16decl: Qualifiers of array type are for element typeMichael Forney
2019-05-16decl: extern storage class with initializer is still a definitionMichael Forney
2019-05-16Remove incorrect type equality check in usual arithmetic conversionsMichael Forney
Integer types still undergo integer promotions even if they are the same type.
2019-05-15Implement asm labelsMichael Forney