Age | Commit message (Collapse) | Author | |
---|---|---|---|
2021-10-21 | expr: Implement binary integer constants | Michael Forney | |
These are in the latest C23 draft. | |||
2021-10-20 | expr: Fix octal escapes followed by octal digits | Michael Forney | |
2021-10-20 | expr: Add support for wide string literals | Michael Forney | |
Thanks to Nihal Jere for his initial patches implementing this feature. Fixes #35. | |||
2021-10-18 | expr: Make sure __builtin_va_end argument is evaluated for side-effects | Michael Forney | |
2021-10-03 | expr: Use end pointer to detect string-to-number conversion failures | Michael Forney | |
We explicitly ignore ERANGE for strtod, and in any other error case, the end pointer is set to the beginning of the string. | |||
2021-10-03 | qbe: Remove some unused includes | Michael Forney | |
We now hard-code the float precision in the format string instead of using the float.h macros. The other headers were never used (except maybe prior to the first commit). | |||
2021-09-29 | Rename uint64_t field of constant union to u | Michael Forney | |
This will prepare us for adding a signed int64_t field called i. | |||
2021-09-29 | Use unsigned long long for sizes and offsets | Michael Forney | |
We don't need exact-width integer types here. | |||
2021-09-28 | expr: Skip codegen for unused expression in conditional with constant expression | Michael Forney | |
This compiles `0 ? e1 : e2` as `e2`, and `1 ? e1 : e2` as `e1` (while still adjusting the type as necessary). | |||
2021-09-28 | mkexpr: Add a base parameter to mkexpr | Michael Forney | |
2021-09-28 | Skip unnecessary conversion to bool for logical and conditional expressions | Michael 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-13 | Revert "Add stringconcat function to concatenate adjacent string literals" | Michael Forney | |
This reverts commit c16f07acf655b9f4fb006d8256b4027fb5a13aa8. This incorrectly allows octal escapes to span between adjacent string literals (e.g. "\0" "1" is not the same as "\01"). | |||
2021-09-13 | Make string literal data unsigned char | Michael Forney | |
2021-09-07 | expr: Fix varargs again and add more tests | Michael Forney | |
2021-09-06 | Fix type-checking of va_list arguments to varargs built-ins | Michael Forney | |
If the argument was a function parameter, its type has already been adjusted. So on x86_64, we can't just ignore the automatic array-to-pointer conversion, since it was never a pointer to begin with. Instead, keep track of the adjusted va_list type, and check that the arguments to varargs built-ins match that type. | |||
2021-09-04 | Use architecture-specific va_list type | Michael 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-09-04 | Prepare for supporting architecture-specific va_list type | Michael Forney | |
2021-06-28 | Add stringconcat function to concatenate adjacent string literals | Michael Forney | |
This function also ensures that the string prefixes (if any) are compatible. It should make it easier to implement wide string support. | |||
2021-05-02 | expr: Include NUL-terminator in string expression data | Michael Forney | |
This will facilitate the support of wide-string literals. Based on patch from Nihal Jere. | |||
2020-04-05 | expr: Just ignore decayed operand in unary `&` operator | Michael Forney | |
Reusing the decayed expression is more complicated, and only saved one malloc. | |||
2020-04-04 | expr: Add type checking for equality and relational expressions | Michael Forney | |
2020-04-04 | expr: Fix type of '&' operator applied to array | Michael 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-18 | expr: Slight simplification in function call parsing | Michael Forney | |
2020-01-30 | expr: String literals have complete type | Michael Forney | |
2019-12-27 | expr: Disallow function/incomplete types and bit-fields in sizeof/_Alignof | Michael Forney | |
2019-08-12 | Revert "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-07-11 | expr: Fix cast of same type | Michael Forney | |
2019-07-03 | Implement no-op __builtin_expect | Michael Forney | |
2019-06-27 | Implement prefixed character constants | Michael Forney | |
2019-05-12 | eval: Keep track of kind of constant expression we are evaluating | Michael Forney | |
When we are evaluating an arithmetic constant expression, we don't want to indroduce static data definitions for string or compound literals. Fixes #59. | |||
2019-04-24 | Use a common member for expression base | Michael Forney | |
2019-04-24 | Use a common member for expression op | Michael Forney | |
2019-04-24 | expr: Free subexpressions in delexpr | Michael Forney | |
2019-04-24 | Implement _Generic selection | Michael Forney | |
2019-04-23 | Fix integer promotion on bit-fields | Michael Forney | |
Fixes #47. | |||
2019-04-23 | Improve some error messages | Michael Forney | |
2019-04-23 | expr: Add mkincdecexpr for pre/postfix inc/decrement operators | Michael Forney | |
2019-04-23 | expr: Use tokstr in ++/-- operator error messages | Michael Forney | |
2019-04-23 | expr: Add some type checking for unary operators | Michael Forney | |
2019-04-23 | expr: Check qualifiers when parsing ++/-- expressions | Michael Forney | |
2019-04-22 | expr: Fix check of not enough arguments for function call | Michael Forney | |
2019-04-21 | Keep track of type properties in type | Michael Forney | |
2019-04-20 | Shorten some names with 'long' | Michael Forney | |
2019-04-17 | Allow designators in __builtin_offsetof | Michael Forney | |
2019-04-16 | Implement __builtin_types_compatible_p | Michael Forney | |
This is used by util-linux. | |||
2019-04-15 | expr: Handle compound assignment of bit-fields | Michael Forney | |
2019-04-15 | expr: Simplify assignexpr slightly | Michael Forney | |
2019-04-15 | Style | Michael Forney | |
2019-04-15 | expr: Check operand to '&' operator | Michael Forney | |
2019-04-14 | Initial support for loading/storing bit-fields | Michael Forney | |