Age | Commit message (Collapse) | Author |
|
This compiles `0 ? e1 : e2` as `e2`, and `1 ? e1 : e2` as `e1`
(while still adjusting the type as necessary).
|
|
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).
|
|
|
|
|
|
|
|
|
|
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.
|
|
|
|
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.
|
|
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.
|
|
Make an exception for flexible array members, though we should also
check that the flexible array member, if any, is last.
|
|
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.
|
|
|
|
This will facilitate the support of wide-string literals.
Based on patch from Nihal Jere.
|
|
|
|
|
|
|
|
C11 6.7.5p6 says "An alignment specification of zero has no effect".
|
|
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.
|
|
Move jump and phi instructions to struct block, and function arguments
to their own instruction.
This will facilitate allocating instructions as an array.
|
|
The struct-passing test checks for function definitions with struct
arguments, but we were missing a test for function calls with struct
arguments.
|
|
|
|
It should be a pointer to the array, not to the first element (as
it would after implicit conversion without the '&' operator).
|
|
|
|
|
|
|
|
|
|
|
|
The token pasting operator `##` still needs to be implemented.
|
|
|
|
This was regressed in d889bc80be and fixed in 090e2932ce.
|
|
|
|
This should have been removed when "expr: Fix cast of same type" was
reverted in 0d1969024c.
|
|
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`.
|
|
|
|
|
|
|
|
The end of C11 6.7.6.3p15 says that qualifiers should be ignored when
checking compatibility of function types.
|
|
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.
|
|
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.
|
|
|
|
|
|
|
|
|
|
This is C99, but is not supported by fscanf in OpenBSD, so floating
constants can't be read back in by QBE.
|
|
|
|
|
|
|
|
|
|
Integer types still undergo integer promotions even if they are the
same type.
|