From: Stepan D. <stp...@na...> - 2013-07-29 16:56:34
|
Just in case, I have already added temporary it in my sources. To do that you should implement AVRAsmPrinter::EmitStartOfAsmFile method (that is virtual for AsmPrinter). Currently it looks like: void AVRAsmPrinter::EmitStartOfAsmFile(Module &M) { // FIXME: Perhaps do it somehow with OutStreamer.EmitAssignment OutStreamer.EmitRawText(StringRef( "__SP_H__ = 0x3e\n\t" "__SP_L__ = 0x3d\n\t" "__SREG__ = 0x3f\n\t" "__tmp_reg__ = 0\n\t" "__zero_reg__ = 1\n\t" )); } Borja Ferrer wrote: > Ok yes I will add this tonight. > > El lunes, 29 de julio de 2013, Stepan Dyatkovskiy escribió: > > Yes. I mean just header for .s file, so it should be equal to > avr-gcc. For set_system_time.c gcc produces next header: > > .file "set_system_time.c" > __SP_H__ = 0x3e > __SP_L__ = 0x3d > __SREG__ = 0x3f > __tmp_reg__ = 0 > __zero_reg__ = 1 > ... > > Just compare our output and one generated by gcc (in attachment). > > > > Borja Ferrer wrote: > > You mean in the header (top) of the .S file instead of the > footer no? > > > 2013/7/29 Stepan Dyatkovskiy <stp...@na... > <mailto:stp...@na...>> > > Currently I have found that set_system_time.c hardcodes > __SREG__ and > __tmp_reg__ names in inlineasm. GCC just puts the footer > for all .s > files: > __SP_H__ = 0x3e > __SP_L__ = 0x3d > __SREG__ = 0x3f > __tmp_reg__ = 0 > __zero_reg__ = 1 > > Can we do the same? > > -Stepan. > > Borja Ferrer wrote: > > Hello Stepan, > > 1) Yes, I'm aware of our double width definition in > clang. I > have to do > some tests before changing it in clang and other places > back to > 32bits, > so in the meantime it's ok to leave that change locally > for you. > > 2) If I understand that code correctly they are setting > SI to an > integer > type which is 16bits for our target. If that's the > case, they > have to > take care of ints being smaller than 32 bits. They > check in the > 64bit > case for the long type width and do it right there. So > I would > say fill > in a bug report or send them a patch if you have the fix. > > Btw, if you want, create a branch in svn and add there > all the > avrlibc > patches and stuff instead of getting them lost here in the > mailing list. > > > > 2013/7/29 Stepan Dyatkovskiy <stp...@na... > <mailto:stp...@na...> <mailto:stp...@na... > <mailto:stp...@na...>>> > > > Currently I'm considering it as clang bug. In > handleModeAttr they > handle 'SI' as 32 bit value (that's ok for us, but > instead > it should > be 4*QI), and what is really wrong for AVR is how > 32 value > type is > handled here: > > case 32: > if (!IntegerMode) > NewTy = S.Context.FloatTy; > else if (OldTy->isSignedIntegerType()) > NewTy = S.Context.IntTy; > else > NewTy = S.Context.UnsignedIntTy; > > -Stepan. > > Stepan Dyatkovskiy wrote: > > Hi Borja, > > In clang/lib/Basic/Targets.cpp, > AVRTargetInfo::AVRTargetInfo()______, I have > > changed DoubleWidth to 32 bit value. Is it > legal? I > mean why it > was 64 > bits, doesn't it has some pitfalls? Anyway I > allowed me to > compile that > large source. > > > > typedef unsigned int uint32_t > __attribute__ > ((__mode__ > > (__SI__))); > > I have found the next info about it > > (http://www.delorie.com/gnu/______docs/gcc/gcc_80.html > <http://www.delorie.com/gnu/____docs/gcc/gcc_80.html> > <http://www.delorie.com/gnu/____docs/gcc/gcc_80.html > <http://www.delorie.com/gnu/__docs/gcc/gcc_80.html>> > > <http://www.delorie.com/gnu/____docs/gcc/gcc_80.html > <http://www.delorie.com/gnu/__docs/gcc/gcc_80.html> > <http://www.delorie.com/gnu/__docs/gcc/gcc_80.html > <http://www.delorie.com/gnu/docs/gcc/gcc_80.html>>>): > > > QI -- An integer that is as wide as the smallest > addressable unit, > usually 8 bits. > HI -- An integer, twice as wide as a QI mode > integer, > usually 16 > bits. > SI -- An integer, four times as wide as a QI > mode integer, > usually 32 bits. > DI -- An integer, eight times as wide as a QI > mode integer, > usually 64 > bits. > SF -- A floating point value, as wide as a SI > mode integer, > usually 32 > bits. > DF -- A floating point value, as wide as a DI > mode integer, > usually 64 bits. > > It is implemented in > clang/lib/Sema/SemaDeclAttr.______cpp, in > > handleModeAttr > static function. > > Perhaps we just have to sort it out in > AVRTargetInfo... > > -Stepan. > > Borja Ferrer wrote: > > Found it, the isfinite() function takes in a > double, and > since our > backend treats them as 64bit types this > fails in > inline asm. > Removing > the function implementation and just > leaving it as > an extern > compiles > successfully. > > > 2013/7/28 Borja Ferrer <bor...@gm... > <mailto:bor...@gm...> > <mailto:bor...@gm... > <mailto:bor...@gm...>> > <mailto:bor...@gm... > <mailto:bor...@gm...> > <mailto:bor...@gm... > <mailto:bor...@gm...>>__>__> > > I've tried different optimization > levels and > they all > fail for me. > The interesting thing is that i've > isolated > the strtod > function in a > different file and it compiles fine, > so there's > something in the > huge file that causes this. > > > 2013/7/28 Stepan Dyatkovskiy > <stp...@na... <mailto:stp...@na...> > <mailto:stp...@na... > <mailto:stp...@na...>> > <mailto:stp...@na... > <mailto:stp...@na...> <mailto:stp...@na... > <mailto:stp...@na...>>>> > > > > > > Ok this was a bit insane to > reduce but > I've > found the > offending lines. > > > > The problem is how uint32_t and > uint16_t are > defined: > > typedef unsigned int uint16_t > __attribute__ > ((__mode__ > (__HI__))); > > > > typedef unsigned int uint32_t > __attribute__ > ((__mode__ > (__SI__))); > > > > I have no idea what this > syntax is, > but if you > refedefine > those types to unsigned int / > long the > problem > goes away. > > Wow great. Never expected that wrong > definition. > > > > > Now im getting an error in > llc: error: > couldn't > allocate > input reg for constraint 'r' > > > > Hm.. May be try with O2 instead > of Os? > > > 2013/7/28 Borja Ferrer > <bor...@gm... <mailto:bor...@gm...> > <mailto:bor...@gm... > <mailto:bor...@gm...>> > <mailto:bor...@gm... > <mailto:bor...@gm...> > <mailto:bor...@gm... > <mailto:bor...@gm...>>__>__> > > > >> I've compiled the file you > attached, > ignoring > all warnings i > get from clang about the unknown > attributes like > progmem, i'm > getting the assertion "multibyte > index is > out of > range." > >> > >> 2013/7/28 Borja Ferrer > <bor...@gm... <mailto:bor...@gm...> > <mailto:bor...@gm... > <mailto:bor...@gm...>> > <mailto:bor...@gm... > <mailto:bor...@gm...> > <mailto:bor...@gm... > <mailto:bor...@gm...>>__>__> > >> > >>> Hello Stepan, > >>> > >>> 1) It seems clang mangles > assembly > functions > names by > prefixing a \01 character. I haven't > found yet the > code that > does this depending on the > target used. > >>> > >>> 2) About the code above, I'm > assuming you got > that inline > asm code from the > __LPM_dword_classic__ > macro. > This is what I'm > getting for the following C code: > >>> typedef unsigned int uint16_t; > >>> typedef unsigned long uint32_t; > >>> > >>> #define > __LPM_dword_classic__(addr) \ > >>> (__extension__({ \ > >>> uint16_t __addr16 = > (uint16_t)(addr); \ > >>> uint32_t __result; \ > >>> __asm__ __volatile__ \ > >>> > >>> ( \ > >>> "lpm" "\n\t" \ > >>> "mov %A0, r0" "\n\t" \ > >>> "adiw r30, 1" "\n\t" \ > |