flush
authorMichael Wallner <mike@php.net>
Thu, 22 Oct 2015 19:56:44 +0000 (21:56 +0200)
committerMichael Wallner <mike@php.net>
Thu, 22 Oct 2015 19:56:44 +0000 (21:56 +0200)
src/libffi.c
src/parser.h
src/parser_proc.h
src/parser_proc.y
src/validator.c

index 4963fc55268868e0b9500c5369d8520c08858bc2..2c68fbf0ee4bb34834dd51b910bdb1ec39e3f3e5 100644 (file)
@@ -10,6 +10,9 @@
 # endif
 # if HAVE_SYS_MMAN_H
 #  include <sys/mman.h>
+#  ifndef MAP_ANONYMOUS
+#   define MAP_ANONYMOUS MAP_ANON
+#  endif
 # endif
 #endif
 
index fe3ff8e8759b9aacbd7f21ce1b5b307438abfa13..8df41eafe50cf95aceba8e8fd9e32a938c809d1f 100644 (file)
@@ -25,6 +25,7 @@ typedef struct decl_type {
        char *name;
        token_t type;
        struct decl_type *real;
+       struct decl_struct *strct;
 } decl_type;
 
 static inline decl_type *init_decl_type(token_t type, char *name) {
@@ -248,6 +249,54 @@ static inline void free_decls(decls *decls) {
        free(decls);
 }
 
+typedef struct decl_struct_layout {
+       size_t pos;
+       size_t len;
+} decl_struct_layout;
+
+typedef struct decl_struct {
+       char *name;
+       decl_args *args;
+       decl_struct_layout *layout;
+} decl_struct;
+
+static inline decl_struct *init_decl_struct(char *name, decl_args *args) {
+       decl_struct *s = calloc(1, sizeof(*s));
+       s->name = strdup(name);
+       s->args = args;
+       return s;
+}
+
+static inline void free_decl_struct(decl_struct *s) {
+       free_decl_args(s->args);
+       free(s->name);
+       free(s);
+}
+
+typedef struct decl_structs {
+       size_t count;
+       decl_struct **list;
+} decl_structs;
+
+static inline decl_structs *add_decl_struct(decl_structs *ss, decl_struct *s) {
+       if (!ss) {
+               ss = calloc(1, sizeof(*ss));
+       }
+       ss->list = realloc(ss->list, ++ss->count * sizeof(*ss->list));
+       ss->list[ss->count-1] = s;
+       return ss;
+}
+
+static inline void free_decl_structs(decl_structs *ss) {
+       size_t i;
+
+       for (i = 0; i < ss->count; ++i) {
+               free_decl_struct(ss->list[i]);
+       }
+       free(ss->list);
+       free(ss);
+}
+
 typedef union impl_val {
        unsigned char bval;
        char cval;
@@ -775,6 +824,7 @@ typedef void (*psi_error_cb)(int type, const char *msg, ...);
 #define PSI_DATA_MEMBERS \
        constants *consts; \
        decl_typedefs *defs; \
+       decl_structs *structs; \
        decls *decls; \
        impls *impls; \
        char *lib; \
@@ -796,6 +846,9 @@ static inline void PSI_DataDtor(PSI_Data *data) {
        if (data->defs) {
                free_decl_typedefs(data->defs);
        }
+       if (data->structs) {
+               free_decl_structs(data->structs);
+       }
        if (data->decls) {
                free_decls(data->decls);
        }
index 492a681563eca3aac80cb3935434300ba5eace18..bdc0b4572f228a0f77fd44a02a864002080474d2 100644 (file)
@@ -2,37 +2,37 @@
 #define PSI_T_LIB                              2
 #define PSI_T_QUOTED_STRING                    3
 #define PSI_T_EOS                              4
-#define PSI_T_BOOL                             5
-#define PSI_T_INT                              6
-#define PSI_T_FLOAT                            7
-#define PSI_T_STRING                           8
-#define PSI_T_CONST                            9
-#define PSI_T_NSNAME                          10
-#define PSI_T_EQUALS                          11
-#define PSI_T_TYPEDEF                         12
-#define PSI_T_NAME                            13
-#define PSI_T_LPAREN                          14
-#define PSI_T_RPAREN                          15
-#define PSI_T_LBRACKET                        16
-#define PSI_T_NUMBER                          17
-#define PSI_T_RBRACKET                        18
-#define PSI_T_DIGITS                          19
-#define PSI_T_COMMA                           20
-#define PSI_T_VOID                            21
-#define PSI_T_CHAR                            22
-#define PSI_T_SHORT                           23
-#define PSI_T_LONG                            24
-#define PSI_T_DOUBLE                          25
-#define PSI_T_SINT8                           26
-#define PSI_T_UINT8                           27
-#define PSI_T_SINT16                          28
-#define PSI_T_UINT16                          29
-#define PSI_T_SINT32                          30
-#define PSI_T_UINT32                          31
-#define PSI_T_SINT64                          32
-#define PSI_T_UINT64                          33
-#define PSI_T_LBRACE                          34
-#define PSI_T_RBRACE                          35
+#define PSI_T_STRUCT                           5
+#define PSI_T_NAME                             6
+#define PSI_T_LBRACE                           7
+#define PSI_T_RBRACE                           8
+#define PSI_T_BOOL                             9
+#define PSI_T_INT                             10
+#define PSI_T_FLOAT                           11
+#define PSI_T_STRING                          12
+#define PSI_T_CONST                           13
+#define PSI_T_NSNAME                          14
+#define PSI_T_EQUALS                          15
+#define PSI_T_TYPEDEF                         16
+#define PSI_T_LPAREN                          17
+#define PSI_T_RPAREN                          18
+#define PSI_T_LBRACKET                        19
+#define PSI_T_NUMBER                          20
+#define PSI_T_RBRACKET                        21
+#define PSI_T_COMMA                           22
+#define PSI_T_VOID                            23
+#define PSI_T_CHAR                            24
+#define PSI_T_SHORT                           25
+#define PSI_T_LONG                            26
+#define PSI_T_DOUBLE                          27
+#define PSI_T_SINT                          28
+#define PSI_T_UINT                          29
+#define PSI_T_SINT16                          30
+#define PSI_T_UINT16                          31
+#define PSI_T_SINT32                          32
+#define PSI_T_UINT32                          33
+#define PSI_T_SINT64                          34
+#define PSI_T_UINT64                          35
 #define PSI_T_FUNCTION                        36
 #define PSI_T_COLON                           37
 #define PSI_T_REFERENCE                       38
index fb7f53b0d4553011ca80d0dadcf5f820322e576e..d368914f442bd091de8650e35926d4cc4272102c 100644 (file)
@@ -46,6 +46,14 @@ block ::= decl_typedef(def). {
 block ::= constant(constant). {
        P->consts = add_constant(P->consts, constant);
 }
+block ::= decl_struct(strct). {
+       P->structs = add_decl_struct(P->structs, strct);
+}
+
+%type decl_struct {decl_struct*}
+decl_struct(strct) ::= STRUCT NAME(N) LBRACE struct_args(args) RBRACE. {
+       strct = init_decl_struct(N->text, args);
+}
 
 %type const_type {const_type*}
 const_type(type_) ::= BOOL(T). {
@@ -71,10 +79,16 @@ constant(constant) ::= CONST const_type(type) NSNAME(T) EQUALS impl_def_val(val)
 }
 
 %type decl_typedef {decl_typedef*}
-decl_typedef(def) ::= TYPEDEF NAME(ALIAS) decl_type(type) EOS. {
+decl_typedef(def) ::= TYPEDEF decl_type(type) NAME(ALIAS) EOS. {
        def = init_decl_typedef(ALIAS->text, type);
        free(ALIAS);
 }
+decl_typedef(def) ::= TYPEDEF STRUCT(S) NAME(N) NAME(ALIAS) EOS. {
+       def = init_decl_typedef(ALIAS->text, init_decl_type(S->type, N->text));
+       free(ALIAS);
+       free(S);
+       free(N);
+}
 
 %type decl {decl*}
 decl(decl) ::= decl_abi(abi) decl_arg(func) LPAREN decl_args(args) RPAREN EOS. {
@@ -101,7 +115,7 @@ decl_var(var) ::= NAME(T) LBRACKET NUMBER(D) RBRACKET. {
        free(T);
        free(D);
 }
-decl_var(var) ::= pointers(p) NAME(T) LBRACKET DIGITS(D) RBRACKET. {
+decl_var(var) ::= pointers(p) NAME(T) LBRACKET NUMBER(D) RBRACKET. {
        var = init_decl_var(T->text, p+1, atol(D->text));
        free(T);
        free(D);
@@ -128,6 +142,13 @@ decl_args(args) ::= decl_arg(arg). {
 decl_args(args) ::= decl_args(args_) COMMA decl_arg(arg). {
        args = add_decl_arg(args_, arg);
 }
+%type struct_args {decl_args*}
+struct_args(args) ::= decl_arg(arg) EOS. {
+       args = init_decl_args(arg);
+}
+struct_args(args) ::= struct_args(args_) decl_arg(arg) EOS. {
+       args = add_decl_arg(args_, arg);
+}
 
 %type decl_type {decl_type*}
 decl_type(type_) ::= VOID(T). {
index 6bfd4e423b45ba93baf0fdf39e7d4b00bace595d..44ea4ab11c2108385636c3707431dd6fa7e6aaef 100644 (file)
@@ -117,7 +117,7 @@ static inline int validate_decl_func(PSI_Validator *V, decl *decl, decl_arg *fun
                return 0;
        }
 
-       decl->dlptr = dlsym(V->dlopened, func->var->name);
+       decl->dlptr = dlsym(V->dlopened ?: RTLD_NEXT, func->var->name);
        if (!decl->dlptr) {
                V->error(PSI_WARNING, "Failed to located symbol '%s': %s",
                        func->var->name, dlerror());