Some key points,
- This patch fixes the bug https://bugs.llvm.org/show_bug.cgi?id=31530 .
- The test builtins.cpp failed on AVR and is disabled, due to uint16_t is defined to unsigned short. The underlying reason is that the system's libc/stdint.h is used instead of avr-libc's stdint.h.
In avr-libc's stdint, the correct definition is
typedef signed int int8_t attribute((mode(QI)));
typedef unsigned int uint8_t attribute((mode(QI)));
typedef signed int int16_t attribute ((mode (HI)));
typedef unsigned int uint16_t attribute ((mode (HI)));
typedef signed int int32_t attribute ((mode (SI)));
typedef unsigned int uint32_t attribute ((mode (SI)));
typedef signed int int64_t attribute((mode(DI)));
typedef unsigned int uint64_t attribute((mode(DI)));
Redefining __INT16_TYPE__ like this is unusual. The macro is normally defined in InitPreprocessor.cpp; if the logic there is wrong, I'd prefer to fix it there.
For specific types int16_t and uint16_t, I'm not sure if anything inside the compiler actually uses them at the moment, but I'd prefer to encode the type in the TargetInfo, along the lines of getInt64Type(), in case we need these types elsewhere in the future.
Making changes to InitPreprocessor.cpp will affect all targets, and I not familar with other targets. Actually AVR is so special that it defines __INT16_TYPE__ to int.
That shouldn't be a problem as long as you have an appropriate reviewer; I volunteer. :)
You should be able to use getInt64Type() as a model for the necessary changes.