|
From: Borja F. <bor...@gm...> - 2013-07-28 18:37:18
|
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.
Now im getting an error in llc: error: couldn't allocate input reg for
constraint 'r'
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.
>>
>
>
|