aboutsummaryrefslogtreecommitdiff
path: root/qbe.c
AgeCommit message (Collapse)Author
2024-04-21expr: Create decl for compound literal during parseMichael Forney
2024-04-20qbe: Track 'thread' prefix in value kindMichael Forney
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.
2024-04-20qbe: Disallow address of TLS variables in static initializersMichael Forney
The address of an object with thread storage duration is not an address constant.
2024-04-20qbe: Pass struct decl to mkglobal instead of fields from the declMichael Forney
2024-04-20decl: Keep track of storage duration in struct declMichael Forney
2024-04-19implement _Thread_local storage classDrew DeVault
Implements: https://todo.sr.ht/~mcf/cproc/8
2024-04-16qbe: Clarify commentMichael Forney
2024-04-15decl: Support variadic functions with no other parametersMichael Forney
2024-04-15decl: Save and re-open parameter scope for bodyMichael Forney
2024-04-15Remove support for non-prototype function declarations and definitionsMichael Forney
These were removed in C23.
2024-04-12Use struct decl for function parametersMichael Forney
2024-04-12decl: Add name field to decl structMichael Forney
2024-04-06Remove some unnecessary use of array type lengthMichael Forney
2024-03-24map: Use separately allocated struct mapMichael Forney
2024-03-23expr: Keep track of storage duration of compound literalsMichael Forney
2024-03-16Fix C23 empty initializersMichael Forney
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.
2022-11-26Check object alignment in only one placeMichael Forney
2022-11-26Move kind-specific decl fields to unionMichael Forney
2022-11-26Keep track of asmname in decl and remove globalname()Michael Forney
2022-06-27qbe: Insert dead block when compiling unreachable code after a jumpMichael Forney
QBE will optimize out these blocks, and the dead block prevents the possibility of NULL value usage when further control flow follows. Fixes #80.
2022-05-19Add unreachable returns to silence compiler warningsMichael Forney
2022-03-22Allow unnamed parameters in function definitionsMichael Forney
2022-03-10qbe: Only return 0 from main if it has type intMichael Forney
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.
2022-02-10qbe: Switch to new unsigned-float conversion operatorsMichael Forney
2022-02-10qbe: Switch to unary negationMichael Forney
This fixes bugs involving floating point negative zero.
2022-01-22Handle unary minus specially instead of 0 - xMichael Forney
This is necessary to fix unary negation of floating-point 0 (also depends on a pending qbe patch).
2022-01-22Remove most usage of fixed-width integer typesMichael Forney
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.
2022-01-22Port to C99Michael Forney
2021-11-25Add __builtin_unreachable stubMichael Forney
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-25qbe: Add helper function for mkinstMichael Forney
This simplifies the creation of allocation instructions in the start block.
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-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-03expr: Use end pointer to detect string-to-number conversion failuresMichael 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-03qbe: Remove some unused includesMichael 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-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-29qbe: Add missing check that binary operator is + for address constantMichael Forney
2021-09-29Rename uint64_t field of constant union to uMichael Forney
This will prepare us for adding a signed int64_t field called i.
2021-09-29Use unsigned long long for sizes and offsetsMichael Forney
We don't need exact-width integer types here.
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: Support more aligned types in funccopyMichael Forney
We don't have any of these currently, but it's easier to support than to error out.
2021-09-14qbe: Fix temporary type for < 8 byte aligned struct copiesMichael Forney
2021-09-13qbe, init: Handle prefixed string literalsNihal Jere
2021-09-13Make string literal data unsigned charMichael Forney
2021-09-07qbe: Add default cases to avoid uninitialized warningMichael 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-09-02qbe: Error on use of long double rather than trigger assertionMichael Forney
2021-07-05qbe: StyleMichael Forney
2021-07-05qbe: Fix bitfield sign extension with types shorter than intMichael Forney