On Thu, Aug 03, 2017 at 04:13:38PM +0530, Prathamesh Kulkarni wrote: > > You are hardcoding here host characters and using it for target. > > I think you need to use > > lang_hooks.to_target_charset > > (really no idea how it works or doesn't in LTO, but gimple-fold.c is already > > using it among others). > > Also, you're assuming that the 'a'-'z' and 'A'-'Z' ranges are without gaps, > > which isn't the case for e.g. EBCDIC. So I think you'd need to verify > > (once?) that the target charset has this property. > Hi Jakub, > Thanks for the suggestions, I wasn't aware about lang_hooks.to_target_charset. > Would following be a correct check that target has ascii charset and only then > set range to ~[a, z] ? > > target_a = lang_hooks.to_target_charset ('a'); > target_z = lang_hooks.to_target_charset('z'); > if (target_a == 'a' && target_z == 'z') > { > // set vr to ~['a', 'z'] > }
No. E.g. if host == target charset is EBCDIC, then the condition is true, but it isn't a consecutive range. A rough check that would maybe work (at least would be false for EBCDIC and true for ASCII) could be something like: if (target_z > target_a && target_z - target_a == 25) (which is not exact, some strange charset could have say '0'-'9' block in the middle of 'a'-'z' block, and say 'h'-'r' outside of the range), but perhaps good enough for real-world charsets. In any case, you should probably investigate all the locales say in glibc or some other big locale repository whether tolower/toupper have the expected properties there. Plus of course, the set vr to ~[ ] needs to use target_a/target_z. Jakub