Yes, that works much better. However, I fear the problem is more to do with trying to force enums to be a different size which appears not to be supported by most compilers. The IBM C++ compiler apparently has a #pragma which can be used to do it and gcc 4.3 seems to be happy with the hack described but as Duncan says trying to force this behavior in a union is probably less than desirable in the long term. Another ugly hack that I tried: union { uintptr_t V; #ifdef _LP64 SimpleValueType SimpleTyU[2]; # define SimpleTy SimpleTyU[1] #else SimpleValueType SimpleTyU[1]; # define SimpleTy SimpleTyU[0] #endif const Type *LLVMTy; }; This works on my big endian 64-bit system but I've not seen what damage it may do on other platform types. On 4/7/09 4:09 PM, "Anton Korobeynikov" <anton at korobeynikov.info> wrote:> Hello, > >> +static const uintptr_t minus_one = -1; > -1 here is of signed int type. What if you will use -1ULL ?
Hi Neale,> Yes, that works much better. However, I fear the problem is more to do with > trying to force enums to be a different size which appears not to be > supported by most compilers. The IBM C++ compiler apparently has a #pragma > which can be used to do it and gcc 4.3 seems to be happy with the hack > described but as Duncan says trying to force this behavior in a union is > probably less than desirable in the long term.I don't know if the union is invoking undefined behaviour or not, but given the number of compilers it breaks it clearly needs to be changed. I'm not sure the enum needs to be an enum, how about turning it into a uintptr_t instead? Ciao, Duncan.> Another ugly hack that I tried: > > union { > uintptr_t V; > #ifdef _LP64 > SimpleValueType SimpleTyU[2]; > # define SimpleTy SimpleTyU[1] > #else > SimpleValueType SimpleTyU[1]; > # define SimpleTy SimpleTyU[0] > #endif > const Type *LLVMTy; > }; > > This works on my big endian 64-bit system but I've not seen what damage it > may do on other platform types. > > > On 4/7/09 4:09 PM, "Anton Korobeynikov" <anton at korobeynikov.info> wrote: > > > Hello, > > > >> +static const uintptr_t minus_one = -1; > > -1 here is of signed int type. What if you will use -1ULL ? > > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >
On Apr 8, 2009, at 12:50 AM, Duncan Sands wrote:> Hi Neale, > >> Yes, that works much better. However, I fear the problem is more to >> do with >> trying to force enums to be a different size which appears not to be >> supported by most compilers. The IBM C++ compiler apparently has a >> #pragma >> which can be used to do it and gcc 4.3 seems to be happy with the >> hack >> described but as Duncan says trying to force this behavior in a >> union is >> probably less than desirable in the long term. > > I don't know if the union is invoking undefined behaviour or not, > but given > the number of compilers it breaks it clearly needs to be changed. > I'm not sure > the enum needs to be an enum, how about turning it into a uintptr_t > instead?That's fine with me. It's all encapsulated within the MVT class so it should be pretty easy to change. Dan