Retourner au contenu associé (journal : LLVM dans un gestionnaire de paquets ?)
Posté par steckdenis le 01 septembre 2009 à 23:01. En réponse au journal LLVM dans un gestionnaire de paquets ?. Évalué à 4.
#include <stdio.h> #include <stdlib.h> typedef struct { void *buffer; int machin; } maStruct; int main(int argc, char **argv) { maStruct *s = (maStruct *)malloc(sizeof(maStruct)); s->machin = 3; s->buffer = s; printf("Le buffer est à l'adresse %ld", s->buffer); return s->buffer == s; }
/usr/local/bin/llc -o - -march=x86 test.bc
movl 8,ドル (%esp) call malloc
/usr/local/bin/llc -o - -march=x86-64 test.bc
movl 16,ドル %edi call malloc
AltStyle によって変換されたページ (->オリジナル) / アドレス: モード: デフォルト 音声ブラウザ ルビ付き 配色反転 文字拡大 モバイル
[^] # Re: LLVM IR n'est pas portable
Posté par steckdenis . En réponse au journal LLVM dans un gestionnaire de paquets ?. Évalué à 4.
Rah, Clang est vraiment le meilleur : cet exemple est portable, super, magnifique !
Code C:
#include <stdio.h>
#include <stdlib.h>
typedef struct {
void *buffer;
int machin;
} maStruct;
int main(int argc, char **argv)
{
maStruct *s = (maStruct *)malloc(sizeof(maStruct));
s->machin = 3;
s->buffer = s;
printf("Le buffer est à l'adresse %ld", s->buffer);
return s->buffer == s;
}
On compile en bytecode, puis on lance :
/usr/local/bin/llc -o - -march=x86 test.bc
Et un petit extrait :
movl 8,ドル (%esp)
call malloc
Remarque le "8ドル", la taille de ma structure, contenant un pointeur.
Maintenant, sans recompiler le code C, je génère l'assembleur pour x86-64 :
/usr/local/bin/llc -o - -march=x86-64 test.bc
Et j'obtiens ceci :
movl 16,ドル %edi
call malloc
Remarque le 16ドル : ça marche, yeah :D . Le reste est bien en pur 64-bit (ici, on utilise %edi car malloc attend un int, pas un int64).
Bref, +1 pour Clang et LLVM, ils savent ce qu'ils font :) .
PS: J'ai pas vérifié avec llvm-gcc, je n'arrive pas à le compiler.