Share Pastebin
Guest
Public paste!

Untitled

By: a guest | Mar 6th, 2010 | Syntax: C | Size: 6.43 KB | Hits: 149 | Expires: Never
Copy text to clipboard
  1. /**
  2.  * @file   symbol_macros.h
  3.  * @author Rapha?l Monrouzeau <monrou_r@epitech.net>
  4.  * @date   Sun Apr  4 23:22:22 2004
  5.  *
  6.  * @brief  Macros de definition et declaration de symboles.
  7.  *
  8.  *      Toutes les explications fournies ici ne sont qu'un bref
  9.  *      resume, n'hesitez pas a consulter la documentation de
  10.  *      reference des outils pour chacune de leurs fonctionalites que
  11.  *      vous ne connaissez pas.
  12.  *
  13.  *      info as
  14.  *      info ld
  15.  *      info make (parle de gmake)
  16.  *      info gcc
  17.  *
  18.  */
  19.  
  20. #if                     !defined(__symbol_macros_h__)
  21. #  define               __symbol_macros_h__
  22.  
  23. /**
  24.  * Niveau d'alignement des fonctions en octet.
  25.  *
  26.  * L'IA32 ne requiert pas que les pointeurs aient des valeurs
  27.  * multiples d'une certaine puissance de deux (cela est courant sur
  28.  * les autres architectures), mais c'est fortement recommande.
  29.  *
  30.  * Les acces directs a la memoire via une addresse non multiple de 4
  31.  * (on dit que la donnee a laquelle on veut acceder est non alignee)
  32.  * seront beaucoup plus lents.
  33.  *
  34.  * Pour plusieurs raisons il est meme conseille d'aligner sur 8 voir
  35.  * 16.
  36.  */
  37. #  define               FUNC_ALIGN      16
  38.  
  39. /**
  40.  * Niveau d'alignement des donnees en octets.
  41.  */
  42. #  define               DATA_ALIGN      16
  43.  
  44.  
  45. /* -------------------------------------------------------------------- */
  46.  
  47. /**
  48.  * Declare un symbole comme faisant reference a une fonction globale,
  49.  * puis debute sa definition.
  50.  *
  51.  * Avant tout ceci, la macro se place temporairement dans la section
  52.  * .text.
  53.  */
  54. #define GLOBAL_FUNC(name)                                               \
  55. .pushsection .text;                                                     \
  56.         .global name;                                                   \
  57.         .type   name,"function";                                        \
  58.         .func   name;                                                   \
  59.         .balign FUNC_ALIGN, FUNC_ALIGN;                                 \
  60.         name:
  61.  
  62. /**
  63.  * Declare un symbole comme faisant reference a une fonction statique,
  64.  * puis debute sa definition.
  65.  */
  66. #define STATIC_FUNC(name)                                               \
  67. .pushsection .text;                                                     \
  68.         .local  name;                                                   \
  69.         .type   name,"function";                                        \
  70.         .func   name;                                                   \
  71.         .balign FUNC_ALIGN, FUNC_ALIGN;                                 \
  72.         name:
  73.  
  74. /**
  75.  * Met fin a la definition d'une fonction et renseigne sa taille dans
  76.  * la table des symboles.
  77.  *
  78.  * Ensuite retourne dans la section ou l'assembleur se trouvait avant
  79.  * la definition.
  80.  */
  81. #define FUNC_END(name)                                                  \
  82.         .endfunc;                                                       \
  83.         .size name, . - name;                                           \
  84. .popsection
  85.  
  86.  
  87. /* -------------------------------------------------------------------- */
  88.  
  89.  
  90. /**
  91.  * Declare un symbole comme faisant reference a des donnees globales
  92.  * et constantes, puis debute leur definition.
  93.  */
  94. #define GLOBAL_CONST(name)                                              \
  95. .pushsection    .rodata;                                                \
  96.         .global name;                                                   \
  97.         .type   name,"object";                                          \
  98.         .balign DATA_ALIGN, DATA_ALIGN;                                 \
  99.         name:
  100.  
  101. /**
  102.  * Declare un symbole comme faisant reference a des donnees statiques
  103.  * et constantes, puis debute leur definition.
  104.  */
  105. #define STATIC_CONST(name)                                              \
  106. .pushsection    .rodata;                                                \
  107.         .local  name;                                                   \
  108.         .type   name,"object";                                          \
  109.         .balign DATA_ALIGN, DATA_ALIGN;                                 \
  110.         name:
  111.  
  112. /**
  113.  * Declare un symbole comme faisant reference a des donnees globales,
  114.  * puis debute leur definition.
  115.  */
  116. #define GLOBAL(name)                                                    \
  117. .pushsection    .data;                                                  \
  118.         .global name;                                                   \
  119.         .type   name,"object";                                          \
  120.         .balign DATA_ALIGN, DATA_ALIGN;                                 \
  121.         name:
  122.  
  123. /**
  124.  * Declare un symbole comme faisant reference a des donnees statiques,
  125.  * puis debute leur definition.
  126.  */
  127. #define STATIC(name)                                                    \
  128. .pushsection    .data;                                                  \
  129.         .local  name;                                                   \
  130.         .type   name,"object";                                          \
  131.         .balign DATA_ALIGN, DATA_ALIGN;                                 \
  132.         name:
  133.  
  134. /**
  135.  * Declare un symbole comme faisant reference a des donnees globales
  136.  * qui seront initialisees a 0, puis debute leur definition.
  137.  */
  138. #define GLOBAL0(name)                                                   \
  139. .pushsection    .bss;                                                   \
  140.         .global name;                                                   \
  141.         .type   name,"object";                                          \
  142.         .balign DATA_ALIGN, DATA_ALIGN;                                 \
  143.         name:
  144.  
  145. /**
  146.  * Declare un symbole comme faisant reference a des donnees statiques
  147.  * qui seront initialisees a 0, puis debute leur definition.
  148.  */
  149. #define STATIC0(name)                                                   \
  150. .pushsection    .bss;                                                   \
  151.         .local  name;                                                   \
  152.         .type   name,"object";                                          \
  153.         .balign DATA_ALIGN, DATA_ALIGN;                                 \
  154.         name:
  155.  
  156. /**
  157.  * Met fin a la definition de donnees et renseigne leur taille dans la
  158.  * table des symboles.
  159.  */
  160. #define OBJECT_END(name)                                                \
  161.         .size   name, . - name;                                         \
  162. .popsection
  163.  
  164.  
  165. #endif                  /* __symbol_macros_h__ */