|
From: Stepan D. <stp...@na...> - 2013-07-28 19:16:54
|
> 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...>
>
>> 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...>
>>
>>> 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" \
>>>
>>> "lpm" "\n\t" \
>>> "mov %B0, r0" "\n\t" \
>>> "adiw r30, 1" "\n\t" \
>>> "lpm" "\n\t" \
>>>
>>> "mov %C0, r0" "\n\t" \
>>> "adiw r30, 1" "\n\t" \
>>> "lpm" "\n\t" \
>>> "mov %D0, r0" "\n\t" \
>>>
>>> : "=r" (__result), "=z" (__addr16) \
>>> : "1" (__addr16) \
>>> : "r0" \
>>>
>>> ); \
>>>
>>> __result; \
>>> }))
>>> unsigned long inlineasm(unsigned int addr)
>>> {
>>> return __LPM_dword_classic__(addr);
>>> }
>>>
>>> clang produces:
>>>
>>> define i32 @inlineasm(i16 %addr) #0 {
>>>
>>> entry:
>>> %0 = tail call { i32, i16 } asm sideeffect "lpm\0A\09mov ${0:A}, r0\0A\09adiw r30, 1\0A\09lpm\0A\09mov ${0:B}, r0\0A\09adiw r30, 1\0A\09lpm\0A\09mov ${0:C}, r0\0A\09adiw r30, 1\0A\09lpm\0A\09mov ${0:D}, r0\0A\09", "=r,=z,1,~{r0}"(i16 %addr) #2, !srcloc !4
>>>
>>> %asmresult = extractvalue { i32, i16 } %0, 0
>>> ret i32 %asmresult
>>> }
>>>
>>> No truncations here as far i can tell. Try this code and see what you get.
--
Truly yours,
Stepan Dyatkovskiy
|