From: Borja F. <bor...@gm...> - 2013-07-29 17:04:10
|
Yes, that's the way of doing it, thanks for the code, I will add it later. So how many files have you successfully compiled so far? 2013/7/29 Stepan Dyatkovskiy <stp...@na...> > 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> >> >> >> >> >> <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" \ >> >> > |