Re: __user annotations

From: Paul Mackerras (paulus@samba.org)
Date: Fri Jun 06 2003 - 19:52:55 EST


Sam Ravnborg writes:

> Cloned it today - compiled without a single warning.
> (RH8.0, gcc 3.2)

Hmmm, I am using gcc 3.3 (debian sid).

> My version looks like this:
> struct preprocessor_sym {
> struct token *expansion;
> struct token *arglist;
> }; <= line 73

So does mine.

> struct ctype_sym {
>
> Looks like something wrong at your side...

Well, does symbol.h have a `ctype' member in your copy? It doesn't in
mine. And line 44 of parse.c says:

        sym->ctype.base_type = ctype->base_type;

which fails because sym is a struct symbol * and struct symbol doesn't
have a ctype member. And FWIW the compilation fails with gcc-3.2 too.

I have included the version of symbol.h that I have below. Could you
compare that against yours and/or do a pull and see if it still works
for you?

Paul.

#ifndef SYMBOL_H
#define SYMBOL_H
/*
 * Basic symbol and namespace definitions.
 *
 * Copyright (C) 2003 Transmeta Corp.
 *
 * Licensed under the Open Software License version 1.1
 */

#include "token.h"

/*
 * An identifier with semantic meaning is a "symbol".
 *
 * There's a 1:n relationship: each symbol is always
 * associated with one identifier, while each identifier
 * can have one or more semantic meanings due to C scope
 * rules.
 *
 * The progression is symbol -> token -> identifier. The
 * token contains the information on where the symbol was
 * declared.
 */
enum namespace {
        NS_NONE,
        NS_PREPROCESSOR,
        NS_TYPEDEF,
        NS_STRUCT,
        NS_ENUM,
        NS_LABEL,
        NS_SYMBOL,
        NS_ITERATOR,
};

enum type {
        SYM_BASETYPE,
        SYM_NODE,
        SYM_PTR,
        SYM_FN,
        SYM_ARRAY,
        SYM_STRUCT,
        SYM_UNION,
        SYM_ENUM,
        SYM_TYPEDEF,
        SYM_TYPEOF,
        SYM_MEMBER,
        SYM_BITFIELD,
        SYM_LABEL,
};

struct ctype {
        unsigned long modifiers;
        unsigned long alignment;
        unsigned int contextmask, context, as;
        struct symbol *base_type;
};

struct symbol {
        enum namespace namespace:8;
        enum type type:8;
        struct position pos; /* Where this symbol was declared */
        struct ident *ident; /* What identifier this symbol is associated with */
        struct symbol *next_id; /* Next semantic symbol that shares this identifier */
        struct symbol **id_list; /* Backpointer to symbol list head */
        struct scope *scope;
        struct symbol *same_symbol;
        int (*evaluate)(struct expression *);

        struct preprocessor_sym {
                struct token *expansion;
                struct token *arglist;
        };
        
        struct ctype_sym {
                unsigned long offset;
                unsigned int bit_size;
                unsigned int bit_offset:8,
                                fieldwidth:8,
                                arg_count:10,
                                variadic:1,
                                used:1,
                                initialized:1;
                int array_size;
                struct ctype ctype;
                struct symbol_list *arguments;
                struct statement *stmt;
                struct symbol_list *symbol_list;
                struct expression *initializer;
                long long value; /* Initial value */
        };
        void *aux; /* Auxiliary info, eg. backend information */
};

/* Modifiers */
#define MOD_AUTO 0x0001
#define MOD_REGISTER 0x0002
#define MOD_STATIC 0x0004
#define MOD_EXTERN 0x0008

#define MOD_STORAGE (MOD_AUTO | MOD_REGISTER | MOD_STATIC | MOD_EXTERN | MOD_INLINE | MOD_TOPLEVEL)

#define MOD_CONST 0x0010
#define MOD_VOLATILE 0x0020
#define MOD_SIGNED 0x0040
#define MOD_UNSIGNED 0x0080

#define MOD_CHAR 0x0100
#define MOD_SHORT 0x0200
#define MOD_LONG 0x0400
#define MOD_LONGLONG 0x0800

#define MOD_TYPEDEF 0x1000
#define MOD_STRUCTOF 0x2000
#define MOD_UNIONOF 0x4000
#define MOD_ENUMOF 0x8000

#define MOD_TYPEOF 0x10000
#define MOD_ATTRIBUTE 0x20000
#define MOD_INLINE 0x40000
#define MOD_ADDRESSABLE 0x80000

#define MOD_NOCAST 0x100000
#define MOD_NODEREF 0x200000
#define MOD_ACCESSED 0x400000
#define MOD_TOPLEVEL 0x800000 // scoping..

#define MOD_LABEL 0x1000000

/* Basic types */
extern struct symbol void_type,
                        int_type,
                        label_type,
                        fp_type,
                        vector_type,
                        bad_type;

/* C types */
extern struct symbol bool_ctype, void_ctype,
                        char_ctype, uchar_ctype,
                        short_ctype, ushort_ctype,
                        int_ctype, uint_ctype,
                        long_ctype, ulong_ctype,
                        llong_ctype, ullong_ctype,
                        float_ctype, double_ctype, ldouble_ctype,
                        string_ctype, ptr_ctype, label_type;

/* Basic identifiers */
extern struct ident sizeof_ident,
                        alignof_ident,
                        __alignof_ident,
                        __alignof___ident,
                        if_ident,
                        else_ident,
                        switch_ident,
                        case_ident,
                        default_ident,
                        break_ident,
                        continue_ident,
                        for_ident,
                        while_ident,
                        do_ident,
                        goto_ident,
                        return_ident;

extern struct ident __asm___ident,
                        __asm_ident,
                        asm_ident,
                        __volatile___ident,
                        __volatile_ident,
                        volatile_ident,
                        __attribute___ident,
                        __attribute_ident,
                        pragma_ident;

#define symbol_is_typename(sym) ((sym)->type == SYM_TYPE)

extern struct symbol_list *used_list;

extern void access_symbol(struct symbol *);

extern struct symbol *lookup_symbol(struct ident *, enum namespace);
extern void init_symbols(void);
extern struct symbol *alloc_symbol(struct position, int type);
extern void show_type(struct symbol *);
extern const char *modifier_string(unsigned long mod);
extern void show_symbol(struct symbol *);
extern void show_type_list(struct symbol *);
extern void show_symbol_list(struct symbol_list *, const char *);
extern void add_symbol(struct symbol_list **, struct symbol *);
extern void bind_symbol(struct symbol *, struct ident *, enum namespace);

extern struct symbol *examine_symbol_type(struct symbol *);
extern void examine_simple_symbol_type(struct symbol *);
extern const char *show_typename(struct symbol *sym);

extern void debug_symbol(struct symbol *);
extern void merge_type(struct symbol *sym, struct symbol *base_type);
extern void check_declaration(struct symbol *sym);

#endif /* SEMANTIC_H */
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Sat Jun 07 2003 - 22:00:32 EST