summary refs log tree commit diff
path: root/sysv.c
AgeCommit message (Collapse)Author
2017-04-08prepare for multi-targetQuentin Carbonneaux
This big diff does multiple changes to allow the addition of new targets to qbe. The changes are listed below in decreasing order of impact. 1. Add a new Target structure. To add support for a given target, one has to implement all the members of the Target structure. All the source files where changed to use this interface where needed. 2. Single out amd64-specific code. In this commit, the amd64 target T_amd64_sysv is the only target available, it is implemented in the amd64/ directory. All the non-static items in this directory are prefixed with either amd64_ or amd64_sysv (for items that are specific to the System V ABI). 3. Centralize Ops information. There is now a file 'ops.h' that must be used to store all the available operations together with their metadata. The various targets will only select what they need; but it is beneficial that there is only *one* place to change to add a new instruction. One good side effect of this change is that any operation 'xyz' in the IL now as a corresponding 'Oxyz' in the code. 4. Misc fixes. One notable change is that instruction selection now generates generic comparison operations and the lowering to the target's comparisons is done in the emitter. GAS directives for data are the same for many targets, so data emission was extracted in a file 'gas.c'. 5. Modularize the Makefile. The Makefile now has a list of C files that are target-independent (SRC), and one list of C files per target. Each target can also use its own 'all.h' header (for example to define registers).
2017-02-15comment fixQuentin Carbonneaux
2017-02-15add support for closure callsQuentin Carbonneaux
Compiling languages with closures often requires passing an extra environment parameter to the called function. One solution is to use a convention, and reserve, say, the first argument for that purpose. However, that makes binding to C a little less smooth. Alternatively, QBE now provides a way to remain fully ABI compatible with C by having a "hidden" environment argument (marked with the keyword 'env'). Calling a function expecting an environment from C will make the contents of the environment undefined, but the normal arguments will be passed without alteration. Conversely, calling a C function like it is a closure by passing it an environemnt will work smoothly.
2017-02-14minor cleanup in all.hQuentin Carbonneaux
2017-02-10support variable argument listsQuentin Carbonneaux
This change is backward compatible, calls to "variadic" functions (like printf) must now be annotated (with ...).
2016-08-17silent a few warningsQuentin Carbonneaux
2016-08-16add support for unions in sysv abiQuentin Carbonneaux
2016-08-16parse union typesQuentin Carbonneaux
2016-08-14use an enum for aggregate segmentsQuentin Carbonneaux
2016-08-14get rid of old Alt enumQuentin Carbonneaux
2016-04-20match jumps/ops with il textQuentin Carbonneaux
2016-04-13turn alignment asserts into err()Quentin Carbonneaux
2016-04-12oops, wrong test in abi classify()Quentin Carbonneaux
2016-04-08simplify a buggy testQuentin Carbonneaux
I found it by compiling -O2 and seeing the ABI code fail. Further investigation revealed GCC trimmed away the last iteration of the loop because I was accessing the third element of an array of size two. This is undefined behavior, so GCC "proved" that the last iteration was never run.
2016-04-04fat il!Quentin Carbonneaux
2016-04-04cosmetics in sysv abiQuentin Carbonneaux
A struct of size 0 is now marked as passed in memory. All the ABI code assumes structs passed in registers have size at least 8. This could have an impact on the alignment in the stack, but eh, I guess they are rare.
2016-04-04remove old selpar() codeQuentin Carbonneaux
2016-04-03fix alignment code in selpar()Quentin Carbonneaux
2016-04-03rewrite of selpar() for factoringQuentin Carbonneaux
2016-04-01don't try to keep use counts in abi()Quentin Carbonneaux
Abi lowering does not need use counts, but they are needed for instruction selection. I changed main to call filluse() between these two passes.
2016-03-31move abi code in a new fileQuentin Carbonneaux