<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div>Hello experts,</div><div><br></div><div>I am new to Clang I would like to support a system on chip where the smallest accessible data type is 16-bits.  In other words sizeof(char) == 1 byte == 16 bits.  My understanding is that C/C++ only requires 1 byte >= 8-bits and  sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)  <= sizeof(long long).</div><div><br></div><div>In clang/TargetInfo.h:</div><div><br></div><div><font class="Apple-style-span" face="Monaco" size="3"><span class="Apple-style-span" style="font-size: 12px;">unsigned getBoolWidth(bool isWide = false) const { return 8; }  // FIXME</span></font></div><div><font class="Apple-style-span" face="Monaco" size="3"><span class="Apple-style-span" style="font-size: 12px;">unsigned getBoolAlign(bool isWide = false) const { return 8; }  // FIXME<br><br>unsigned getCharWidth() const { return 8; } // FIXME<br>unsigned getCharAlign() const { return 8; } // FIXME</span></font></div><div><font class="Apple-style-span" face="Monaco" size="3"><span class="Apple-style-span" style="font-size: 12px;">:</span></font></div><div><font class="Apple-style-span" face="Monaco" size="3"><span class="Apple-style-span" style="font-size: 12px;">unsigned getShortWidth() const { return 16; } // FIXME<br>unsigned getShortAlign() const { return 16; } // FIXME</span></font></div><div><br></div><div>These are easy enough to fix and to make them configurable the same as IntWidth and IntAlign are.</div><div> </div><div>There are two consequences that I am aware of that arise because of this change.</div><div><br></div><div>The first is in preprocessor initialization.  InitPreprocessor defines __INT8_TYPE__, __INT16_TYPE_, __INT32_TYPE__, and sometimes __INT64_TYPE__.  It only defines INT64 if sizeof(long long) is 64 which seems odd to me.</div><div><br></div><div><div>  // 16-bit targets doesn't necessarily have a 64-bit type.</div><div>  if (TI.getLongLongWidth() == 64)</div><div>    DefineType("__INT64_TYPE__", TI.getInt64Type(), Buf);</div><div><br></div><div>In my case, __INT8_TYPE__ and __INT64_TYPE__ don't exist so it doesn't really make sense to define them.</div><div><br></div><div>I think a better way of generating these definitions would be to say the following (psuedo-code, it doesn't  actually compile)</div><div><br></div><div><font class="Apple-style-span" face="Monaco" size="3"><span class="Apple-style-span" style="font-size: 12px;">// Define types for char, short, int, long, long long</span></font></div><div><font class="Apple-style-span" face="Monaco"><br></font></div><div><font class="Apple-style-span" face="Monaco" size="3"><span class="Apple-style-span" style="font-size: 12px;">DefineType(  "__INT" + TI.getCharWidth()) + "_TYPE__", TI.getCharWidth());</span></font></div><div><font class="Apple-style-span" face="Monaco" size="3"><span class="Apple-style-span" style="font-size: 12px;"><br></span></font></div><div><font class="Apple-style-span" face="Monaco" size="3"><span class="Apple-style-span" style="font-size: 12px;">if (TI.getShortWidth() > TI.getCharWidth())</span></font></div><div><font class="Apple-style-span" face="Monaco" size="3"><span class="Apple-style-span" style="font-size: 12px;">  DefineType(  "__INT" + TI.getShortWidth() + "_TYPE__", TI.getShortWidth());</span></font></div><div><font class="Apple-style-span" face="Monaco" size="3"><span class="Apple-style-span" style="font-size: 12px;"><br></span></font></div><div><font class="Apple-style-span" face="Monaco" size="3"><span class="Apple-style-span" style="font-size: 12px;">if (TI.getIntWidth() > TI.getShortWidth())</span></font></div><div><font class="Apple-style-span" face="Monaco" size="3"><span class="Apple-style-span" style="font-size: 12px;">   DefineType(  "__INT" + TI.getIntWidth() + "_TYPE__", TI.getIntWidth());</span></font></div><div><font class="Apple-style-span" face="Monaco" size="3"><span class="Apple-style-span" style="font-size: 12px;"><br></span></font></div><div><font class="Apple-style-span" face="Monaco" size="3"><span class="Apple-style-span" style="font-size: 12px;">if (TI.getLongWidth() > TI.getIntWidth())</span></font></div><div><font class="Apple-style-span" face="Monaco" size="3"><span class="Apple-style-span" style="font-size: 12px;">   DefineType(  "__INT" + TI.getLongWidth() + "_TYPE__", TI.getLongWidth());</span></font></div><div><font class="Apple-style-span" face="Monaco" size="3"><span class="Apple-style-span" style="font-size: 12px;"><br></span></font></div><div><font class="Apple-style-span" face="Monaco" size="3"><span class="Apple-style-span" style="font-size: 12px;">if (TI.getLongLongWidth() > TI.getLongWidth())</span></font></div><div><font class="Apple-style-span" face="Monaco" size="3"><span class="Apple-style-span" style="font-size: 12px;">   DefineType(  "__INT" + TI.getLongLongWidth() + "_TYPE__", TI.getLongLongWidth())</span></font>;</div><div><br></div><div>This would result in the creation of __INT8_TYPE__, __INT16_TYPE__, __INT32_TYPE__, __INT64_TYPE__ for most platforms.  For my platform it would only create __INT16_TYPE__, __INT32_TYPE__.  It would also work for wacky 9-bit machines and where INT8s don't make much sense and architectures where long long was 128 bits.</div><div><br></div><div>The other place I am aware of (thanks to useful assertion) that makes a difference is in Lex/LiteralSupport.cpp for the char literal parser.  I am still wrapping my head around this, but I think fixing it for arbitrary size is doable.  (As a new person, I need to figure out a good way to test it.)</div><div><br></div><div>Do these changes seem reasonable to pursue?  What other things are broken in Clang and LLVM by changing the assumption about 8-bit bytes?</div><div><br></div><div>Your advice is appreciated,</div><div>Ray</div><div><br></div><div><br></div><div>   </div></div></body></html>