I ont le code assembleur en ligne ci-dessous:rapports de llvm: asm inline non supporté: entrée avec une sortie correspondant à type 'void *' de type 'int'
int get_year(int a, int *b, char * c)
{
int ret, t1, t2;
asm (
"addl %3, %[a] \n\t"
"movl %[a], %[t1] \n\t"
"movl $58, %%edx \n\t"
"movb %%dl, 0x04(%1) \n\t"
: [t1] "=r" (t1), "=&D" (t2)
: [a] "r" (a), "rm" (*b), "1" (c)
: "edx", "memory"
);
ret = t1;
return ret;
}
Lorsque je compile via les llvm, décharges erreur:
error: unsupported inline asm: input with type 'char *' matching output with type 'int'
: [a] "r" (a), "rm" (*b), "1" (c)
^
Cependant, la fonction memcpy dans le noyau linux a le même format d'utilisation de montage en ligne:
void *memcpy(void *dest, const void *src, size_t n)
{
int d0, d1, d2;
asm volatile(
"rep ; movsl\n\t"
"movl %4,%%ecx\n\t"
"rep ; movsb\n\t"
: "=&c" (d0), "=&D" (d1), "=&S" (d2)
: "0" (n >> 2), "g" (n & 3), "1" (dest), "2" (src)
: "memory");
return dest;
}
et t ses travaux correctement sans aucune erreur de compilation.
On peut supposer que le compilateur gcc ciblé par le noyau n'est pas si strict. Vous pouvez facilement le résoudre en changeant 't2' en' char * ' – Jester
Compiler avec le débogueur' lldb'? –
@MichaelPetch désolé, c'est une erreur de bureau. J'utilise llvm .... –