2012-07-25 3 views
2

GCC fournit une macro prédéfinie __BIGGEST_ALIGNMENT__ qui est le plus grand alignement jamais utilisé pour tout type de données sur la machine cible pour laquelle vous compilez. Je n'arrive pas à trouver l'équivalent d'un LLVM pour ça. Y a-t-il? Si non, quelle est la meilleure façon de le comprendre (de préférence avec pré-processeur)?LLVM équivalent de __BIGGEST_ALIGNMENT__ de gcc?

Répondre

3

Ceci n'est pas accessible depuis le préprocesseur, mais __attribute__((aligned)) ou __attribute__((__aligned__)) (avec la valeur d'alignement omise) donnera l'alignement souhaité. Ceci est supposé donner le plus grand alignement de n'importe quel type intégré, qui est 16 sur x86 et ARM.

Par exemple:

$ cat align.c 
struct foo { 
    char c; 
} __attribute__((aligned)) var; 
$ clang align.c -S -o - -emit-llvm 
... 
@var = global %struct.foo zeroinitializer, align 16 

Ceci est utilisé par unwind.h pour _Unwind_Exception:

struct _Unwind_Exception 
{ 
    _Unwind_Exception_Class exception_class; 
    _Unwind_Exception_Cleanup_Fn exception_cleanup; 
    _Unwind_Word private_1; 
    _Unwind_Word private_2; 

    /* @@@ The IA-64 ABI says that this structure must be double-word aligned. 
    Taking that literally does not make much sense generically. Instead we 
    provide the maximum alignment required by any type for the machine. */ 
} __attribute__((__aligned__)); 
1

Ceci est dans llvm internals comme TargetData :: PointerABIAlign, mais il ne semble pas être exposé au code. Je devrais coder en dur sur 16 octets, car il semblerait que cela prenne un peu de temps avant de voir des types ou des jeux d'instructions plus alignés.

+0

Merci pour l'aperçu. Vous avez suggéré exactement ce que j'ai fait - codé en dur à 16 :-) –

Questions connexes