• [^] # Re: LLVM IR n'est pas portable

    Posté par . En réponse au journal LLVM dans un gestionnaire de paquets ?. Évalué à 4.

    Yeessssss :D

    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.