start work on aggregate types

The parser now has some code to parse the description
of structured types.

I tried to be even less specific than LLVM "type" by
creating just enough abstraction so that I can deal
with both AARCH64 and x64.  The base types used in the
definition of an aggregate are really just syntactic sugar
to give a structure a size and an alignment.  Only the
location of float components matters for the compilation.
In particular this means that the front-ends have to know
how the ABI works to pass/return small integer types.
This also means that the font-end has to be aware of the
layout of structures.

Chris Lattner has a proposition [1] for LLVM that is still
pending and goes in the direction of giving more control
of the ABI the front-end.

[1]: http://www.nondot.org/sabre/LLVMNotes/ExtendedIntegerResults.txt
This commit is contained in:
Quentin Carbonneaux 2015-09-07 21:59:45 -04:00
parent 8f2922eb1a
commit 87ab8941ed
5 changed files with 201 additions and 47 deletions

View file

@ -15,6 +15,7 @@ typedef struct Blk Blk;
typedef struct Tmp Tmp;
typedef struct Con Con;
typedef struct Fn Fn;
typedef struct Type Type;
typedef enum { U, F, T } B3;
@ -51,6 +52,7 @@ enum {
NBlk = 128,
NIns = 256,
NAlign = 3,
NSeg = 32,
BITS = 4,
NBit = 64,
@ -120,8 +122,8 @@ enum Op {
OStores,
OStoreb,
OLoad,
OLoadss,
OLoadus,
OLoadsh,
OLoaduh,
OLoadsb,
OLoadub,
OAlloc,
@ -197,14 +199,6 @@ struct Blk {
};
struct Tmp {
#if 0
enum {
TUndef,
TWord,
TLong,
TReg,
} type;
#endif
char name[NString];
uint ndef, nuse;
uint cost;
@ -232,6 +226,18 @@ struct Fn {
int nblk;
Blk **rpo;
int svec[NAlign];
char name[NString];
};
struct Type {
int dark;
int size;
int align;
struct {
uint flt:1;
uint len:31;
} seg[NSeg];
};
@ -244,7 +250,7 @@ extern OpDesc opdesc[];
void diag(char *);
void *alloc(size_t);
Blk *blocka(void);
Fn *parsefn(FILE *);
Fn *parse(FILE *);
void printfn(Fn *, FILE *);
/* ssa.c */