[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v11 3/9] xen: introduce DECLARE_BOUNDS



>>> On 05.03.19 at 23:38, <sstabellini@xxxxxxxxxx> wrote:
> --- a/xen/include/xen/lib.h
> +++ b/xen/include/xen/lib.h
> @@ -173,4 +173,92 @@ void init_constructors(void);
>  void *bsearch(const void *key, const void *base, size_t num, size_t size,
>                int (*cmp)(const void *key, const void *elt));
>  
> + /*
> +  * Declare start and end array variables in C corresponding to existing
> +  * linker symbols.
> +  *
> +  * These macros, or an alternative technique, MUST be used any time
> +  * linker symbols are imported into C via the `extern []' idiom.
> +  *
> +  *    __DECLARE_BOUNDS(TYPE, START, START, END)

START used twice here makes it ambiguous which one is which in the
subsequent text.

> +  *  introduces the following two constant expressions
> +  *
> +  *    const TYPE *START;
> +  *    const struct abstract_NAME *END;

For one these are declarations, not (constant) expressions. And
then the declarations produce array types, not pointer types.
Please let's not have a comment which is out of sync with what
it describes from the very beginning.

> +  *  whose values are the linker symbols START and END; these
> +  *  should be the start and end of a memory region.
> +  *
> +  *  You may then use these two inline functions:
> +  *
> +  *    bool NAME_lt(const TYPE *s1, const struct abstract_NAME *s2);
> +  *    ptrdiff_t NAME_diff(const TYPE *s1, const struct abstract_NAME *s2);
> +  *
> +  *  lt returns true iff s1 < s2.
> +  *  diff returns the s2-s1 in units of TYPE.
> +  *
> +  *

Stray double blank comment lines and no mention of _bytediff.

> +static inline ptrdiff_t name ## _diff(const type s1[],                       
>  \
> +                                      const struct abstract_ ## name s2[])   
>  \
> +{                                                                            
>  \
> +    BUILD_BUG_ON(alignof(*s1) != alignof(*s2));                              
>  \
> +    return (ptrdiff_t)((uintptr_t)s2 - (uintptr_t)s1) /                      
>  \
> +           (ptrdiff_t)sizeof(*s1);                                           
>   \
> +}                                                                           

I had specifically asked for this to simply call _bytediff, to limit
redundancy and in particular the total number of casts.

> +static inline ptrdiff_t name ## _bytediff(const type s1[],                   
>  \
> +                                          const struct abstract_ ## name 
> s2[])\
> +{                                                                            
>  \
> +    BUILD_BUG_ON(alignof(*s1) != alignof(*s2));                              
>  \
> +    return (ptrdiff_t)((uintptr_t)s2 - (uintptr_t)s1);                       
>  \
> +}

What's the value of the intermediate casting to uintptr_t? Why not
cast to ptrdiff_t right away?

I also don't think the BUILD_BUG_ON() is helpful in this latter case.

Jan



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.