X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCsymt.h;h=79230277b586947d5cae4404cf6f747c3ef8f5e1;hb=88148f76f1aaebb5722c83055ddb94714b174082;hp=be9fcadde48a2db79655ba794874158d8852df13;hpb=0e18a035fdb973255cb7a16fe8eed01573cc7861;p=fw%2Fsdcc diff --git a/src/SDCCsymt.h b/src/SDCCsymt.h index be9fcadd..79230277 100644 --- a/src/SDCCsymt.h +++ b/src/SDCCsymt.h @@ -29,6 +29,7 @@ #define SDCC_NAME_MAX 3*SDCC_SYMNAME_MAX // big enough for ___etc #include "SDCChasht.h" #include "SDCCglobl.h" +#include "dbuf.h" #define INTNO_MAX 255 /* maximum allowed interrupt number */ #define INTNO_UNSPEC (INTNO_MAX+1) /* interrupt number unspecified */ @@ -155,6 +156,7 @@ typedef struct specifier unsigned b_signed:1; /* just for sanity checks only*/ unsigned b_static:1; /* 1=static keyword found */ unsigned b_extern:1; /* 1=extern found */ + unsigned b_inline:1; /* inline function requested */ unsigned b_absadr:1; /* absolute address specfied */ unsigned b_volatile:1; /* is marked as volatile */ unsigned b_const:1; /* is a constant */ @@ -245,6 +247,7 @@ typedef struct sym_link unsigned critical:1; /* critical function */ unsigned intrtn:1; /* this is an interrupt routine */ unsigned rbank:1; /* seperate register bank */ + unsigned inlinereq:1; /* inlining requested */ unsigned intno; /* 1=Interrupt svc routine */ short regbank; /* register bank 2b used */ unsigned builtin; /* is a builtin function */ @@ -267,7 +270,7 @@ typedef struct symbol int key; unsigned flexArrayLength; /* if the symbol specifies a struct with a "flexible array member", then the additional length in bytes for - the "fam" is stored here. Because the lenght can be different from symbol + the "fam" is stored here. Because the length can be different from symbol to symbol AND v_struct isn't copied in copyLinkChain(), it's located here in the symbol and not in v_struct or the declarator */ unsigned implicit:1; /* implicit flag */ @@ -284,6 +287,7 @@ typedef struct symbol unsigned addrtaken:1; /* address of the symbol was taken */ unsigned isreqv:1; /* is the register equivalent of a symbol */ unsigned udChked:1; /* use def checking has been already done */ + unsigned generated:1; /* code generated (function symbols only) */ /* following flags are used by the backend for code generation and can be changed @@ -325,7 +329,7 @@ typedef struct symbol struct iCode *fuse; /* furthest use */ struct iCode *rematiCode; /* rematerialise with which instruction */ struct operand *reqv; /* register equivalent of a local variable */ - struct symbol *prereqv; /* symbol before register equiv. substituion */ + struct symbol *prereqv; /* symbol before register equiv. substitution */ struct symbol *psbase; /* if pseudo symbol, the symbol it is based on */ union { @@ -352,6 +356,7 @@ typedef struct symbol int used; /* no. of times this was used */ int recvSize; /* size of first argument */ struct bitVect *clashes; /* overlaps with what other symbols */ + struct ast * funcTree; /* function body ast if inlined */ } symbol; @@ -362,6 +367,9 @@ extern sym_link *validateLink(sym_link *l, const char *file, unsigned line); /* Easy Access Macros */ +#define IS_OP_RUONLY(x) (x && IS_SYMOP(x) && OP_SYMBOL(x)->ruonly) +#define IS_OP_ACCUSE(x) (x && IS_SYMOP(x) && OP_SYMBOL(x)->accuse) + #define DCL_TYPE(l) validateLink(l, "DCL_TYPE", #l, DECLARATOR, __FILE__, __LINE__)->select.d.dcl_type #define DCL_ELEM(l) validateLink(l, "DCL_ELEM", #l, DECLARATOR, __FILE__, __LINE__)->select.d.num_elem #define DCL_PTR_CONST(l) validateLink(l, "DCL_PTR_CONST", #l, DECLARATOR, __FILE__, __LINE__)->select.d.ptr_const @@ -386,6 +394,8 @@ extern sym_link *validateLink(sym_link *l, #define FUNC_INTNO(x) (x->funcAttrs.intno) #define FUNC_REGBANK(x) (x->funcAttrs.regbank) #define FUNC_HASSTACKPARM(x) (x->funcAttrs.hasStackParms) +#define FUNC_ISINLINE(x) (x->funcAttrs.inlinereq) +#define IFFUNC_ISINLINE(x) (IS_FUNC(x) && FUNC_ISINLINE(x)) #define FUNC_ISREENT(x) (x->funcAttrs.reent) #define IFFUNC_ISREENT(x) (IS_FUNC(x) && FUNC_ISREENT(x)) @@ -445,6 +455,7 @@ extern sym_link *validateLink(sym_link *l, #define SPEC_TYPEDEF(x) validateLink(x, "SPEC_NOUN", #x, SPECIFIER, __FILE__, __LINE__)->select.s.b_typedef #define SPEC_REGPARM(x) validateLink(x, "SPEC_NOUN", #x, SPECIFIER, __FILE__, __LINE__)->select.s.b_isregparm #define SPEC_ARGREG(x) validateLink(x, "SPEC_NOUN", #x, SPECIFIER, __FILE__, __LINE__)->select.s.argreg +#define SPEC_INLINE(x) validateLink(x, "SPEC_INLINE", #x, SPECIFIER, __FILE__, __LINE__)->select.s.b_inline /* type check macros */ #define IS_DECL(x) ( x && x->class == DECLARATOR ) @@ -478,6 +489,7 @@ extern sym_link *validateLink(sym_link *l, #define IS_REGISTER(x) (IS_SPEC(x) && SPEC_SCLS(x) == S_REGISTER) #define IS_RENT(x) (IS_SPEC(x) && x->select.s._reent ) #define IS_STATIC(x) (IS_SPEC(x) && SPEC_STAT(x)) +#define IS_INLINE(x) (IS_SPEC(x) && SPEC_INLINE(x)) #define IS_INT(x) (IS_SPEC(x) && x->select.s.noun == V_INT) #define IS_VOID(x) (IS_SPEC(x) && x->select.s.noun == V_VOID) #define IS_CHAR(x) (IS_SPEC(x) && x->select.s.noun == V_CHAR) @@ -614,6 +626,7 @@ void processFuncPtrArgs (sym_link *); void processFuncArgs (symbol *); int isSymbolEqual (symbol *, symbol *); int powof2 (TYPE_TARGET_ULONG); +void dbuf_printTypeChain (sym_link *, struct dbuf_s *); void printTypeChain (sym_link *, FILE *); void printTypeChainRaw (sym_link *, FILE *); void initCSupport ();