Age | Commit message (Collapse) | Author |
|
|
|
Adding a bool field increases the size of struct value by 8 due to
alignment.
In the future, maybe we just use something like VALUE_DECL instead.
|
|
The address of an object with thread storage duration is not an
address constant.
|
|
|
|
|
|
Implements: https://todo.sr.ht/~mcf/cproc/8
|
|
|
|
|
|
|
|
These were removed in C23.
|
|
|
|
|
|
|
|
|
|
|
|
These should should act as zero initializers, but since init==NULL
was used to mean both "no initializer" and "empty initializer",
empty initializers weren't zero-initializing the variable.
|
|
|
|
|
|
|
|
QBE will optimize out these blocks, and the dead block prevents the
possibility of NULL value usage when further control flow follows.
Fixes #80.
|
|
|
|
|
|
Though C11 5.1.2.2.1 says that main must have a return type of int,
we could still encounter a program which declares it as something
else. This is undefined behavior, but we should not produce invalid
QBE IL in this case.
Also, 5.1.2.2.3 specifies that the implicit return 0 should only
apply when main's return type is compatible with int.
|
|
|
|
This fixes bugs involving floating point negative zero.
|
|
This is necessary to fix unary negation of floating-point 0 (also
depends on a pending qbe patch).
|
|
We only require a type of at least 64 bits, so just use unsigned
long long.
Only siphash remains as the last user of uint64_t.
|
|
|
|
|
|
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.
|
|
This simplifies the creation of allocation instructions in the start
block.
|
|
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.
|
|
|
|
Although we don't need the cnew in this case, we still need to do
the appropriate extension to 32-bit.
|
|
We explicitly ignore ERANGE for strtod, and in any other error case,
the end pointer is set to the beginning of the string.
|
|
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).
|
|
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.
|
|
|
|
This will prepare us for adding a signed int64_t field called i.
|
|
We don't need exact-width integer types here.
|
|
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).
|
|
We don't have any of these currently, but it's easier to support
than to error out.
|
|
|
|
|
|
|
|
|
|
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.
|
|
|
|
|
|
|