[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v8 04/11] public: xen.h: add definitions for UUID handling
>>> On 11.10.17 at 14:12, <volodymyr_babchuk@xxxxxxxx> wrote: > On 11.10.17 11:07, Jan Beulich wrote: >>>>> On 10.10.17 at 19:03, <volodymyr_babchuk@xxxxxxxx> wrote: >>> On 10.10.17 19:12, Jan Beulich wrote: >>>>>>> On 10.10.17 at 17:52, <volodymyr_babchuk@xxxxxxxx> wrote: >>>>> + uint8_t a[16]; >>>>> +} xen_uuid_t; >>>>> + >>>>> +/* >>>>> + * XEN_DEFINE_UUID(0x00112233, 0x4455, 0x6677, 0x8899, >>>>> + * 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff) >>>>> + * will construct UUID 00112233-4455-6677-8899-aabbccddeeff presented as >>>>> + * {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, >>>>> + * 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff}; >>>>> + * >>>>> + * NB: This is compatible with Linux kernel and with libuuid, but it is >>>>> not >>>>> + * compatible with Microsoft, as they use mixed-endian encoding (some >>>>> + * components are little-endian, some are big-endian). >>>>> + */ >>>>> +#define XEN_DEFINE_UUID_(a, b, c, d, e1, e2, e3, e4, e5, e6) \ >>>>> + {{((a) >> 24) & 0xFF, ((a) >> 16) & 0xFF, \ >>>>> + ((a) >> 8) & 0xFF, ((a) >> 0) & 0xFF, \ >>>>> + ((b) >> 8) & 0xFF, ((b) >> 0) & 0xFF, \ >>>>> + ((c) >> 8) & 0xFF, ((c) >> 0) & 0xFF, \ >>>>> + ((d) >> 8) & 0xFF, ((d) >> 0) & 0xFF, \ >>>>> + e1, e2, e3, e4, e5, e6}} >>>>> + >>>>> +/* Compound literals are supported in C99 and later. */ >>>>> +#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L >>>> >>>> I didn't notice this earlier - why no check for __GNUC__? >>> I have seen pattern "#if defined (__STDC_VERSION__) && __STDC_VERSION__ >> >> But if you check, all of the existing ones have >> "#elif defined(__GNUC__)". > Yes. But there was a reason do to so. For example: > > #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L > uint32_t optarr[]; > #elif defined(__GNUC__) > uint32_t optarr[0]; > #endif > > (xen/include/public/physdev.h:303) > > If compiler is C99 then we use flexible length array, else if compiller > is GCC, we use zero-length array, which is GCC extension (correct me). > Other compilers (non-gcc C90 compatible) are not supported. Probably > this is a bug. Why would that be a bug? In C89 you simply have no way to express what we want, so people using plain C89 compilers will have to code differently (i.e. without using the optarr field) anyway. > Another case is even worse: > > #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L > unsigned char buf[]; > #elif defined(__GNUC__) > unsigned char buf[1]; /* OUT: Variable length buffer with > build_id. */ > > (xen/include/public/version.h:49) That's not very reasonable indeed. > My code does not use gcc-only extensions like zero-length arrays, so I > don't see how #elif defined (__GNUC__) can fit in the my case. Did you check under what conditions the various gcc versions define __STDC_VERSION__? Trying to compile int test(void) { return __STDC_VERSION__; } with e.g. gcc 4.3.4 fails (with no other options specified). Otoh even using -ansi compound literals compile fine. Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |