Accueil Ti-Gen Foire Aux Questions Chat sur le chan #tigcc sur IRC
Liste des membres Rechercher Aide
Bienvenue Invité !   Se connecter             Mes sujets   
Administrer
0 membre(s) et 1 visiteur(s) actif(s) durant les 5 dernières minutes Utilisateurs actifs : Aucun membre + 1 visiteur
Avant de poster sur le forum, il y a des régles de bases à respecter pour une bonne entente et un respect de tous.
Veuillez lire la charte du forum.
  :: Index » Forum Ti68K » Programmation C » [Résolu] Structure dans la pile avec sous fonction (12 réponse(s))
./POST DE DEPART (post n°0)   Marquer comme non lu.
geogeo Ecrit le: Jeudi 14 septembre 2006 à 20:47 Déconnecté(e)    Voir le profil de geogeo Envoyer un email à geogeo Visiter le site WEB de geogeo Envoyer un message privé à geogeo  


J'ai constaté que l'extension sous-fonction était supportée. Plus précisément que ce genre de chose était possible:


void fooa() {
  int add(int a, int b) {
    return (a + b);
  }
  ...
}


Mon soucie est lié à l'organisation, j'ai une fonction qui a besoin de créer temporairement une pile de données, cette pile est donc allouée sur le stack (a7). Mais cette fonction utilise plusieurs fois le même code. J'ai donc décidé de créer une sous fonction. Mais je constate un bug.


GFA_ERROR_NUMBER GFA_ETokenisor_PostfixNotation(GFA_StackTag *stack_tag) {    
  struct {
    const GFA_tag *item[GFA_TAG_STACK_SIZE];
    #ifdef GFA_ETOKENISOR_CHECK_OPERATORS_LEVEL
      short level[GFA_TAG_STACK_SIZE];
    #endif
    unsigned short size;
  } OperatorStack;
  
  bool GFA_OperatorStack_CheckLevel(const GFA_StackTag *stack, const GFA_tag *tag) {
      printf("%d\n", (short)OperatorStack.size);
      
      return true;
  }

  OperatorStack.size = 0;
  printf("%d\n", (short)OperatorStack.size);
  GFA_OperatorStack_CheckLevel(..., ...);

  ...
}


J'obtiens 0, 2240 mais j'obtiens 0, 0 lorsque je passe des pointeurs NULL à GFA_OperatorStack_CheckLevel.

Comment corriger ce bug et existe-il une meilleure organisation pour obtenir ce que je veux ?
-Edité le Samedi 16 septembre 2006 à 14:41 par geogeo-
-Edité le Lundi 25 septembre 2006 à 20:18 par geogeo-
-Edité le Mardi 26 septembre 2006 à 15:53 par geogeo-
Webmaster du site.
Programmeur sur TI68K. Arkanoid, Nebulus, GFA-Basic.

Plus d'informations sur GFA-Basic (un langage Basic pour TI68K).
http://www.tigen.org/gfabasic
    
./Post n°1   Marquer comme non lu.
Kevin Kofler Ecrit le: Vendredi 15 septembre 2006 à 15:02 Déconnecté(e)    Voir le profil de Kevin Kofler Envoyer un email à Kevin Kofler Visiter le site WEB de Kevin Kofler Envoyer un message privé à Kevin Kofler  


On dirait un bogue de GCC, pour changer. :( Donc l'habituel procédé, source complète compilable, bug report etc. Je vais regarder ce qui se passe.
Membre de l'équipe de TIGCC: http://tigcc.ticalc.org
Mainteneur du portage Linux/Unix de TIGCC: http://tigcc.ticalc.org/linux/
Membre de l'équipe de CalcForge: http://www.calcforge.org:70/

Participez à la reprise de Ti-Gen!
    
./Post n°2   Marquer comme non lu.
geogeo Ecrit le: Vendredi 15 septembre 2006 à 18:44 Déconnecté(e)    Voir le profil de geogeo Envoyer un email à geogeo Visiter le site WEB de geogeo Envoyer un message privé à geogeo  


Ah oui franchement n'hésites pas à critiquer le code et surtout l'organisation de la fonction qui pose pb. Car ça me permettera de m'améliorer et d'avoir un code plus maintenable.
Webmaster du site.
Programmeur sur TI68K. Arkanoid, Nebulus, GFA-Basic.

Plus d'informations sur GFA-Basic (un langage Basic pour TI68K).
http://www.tigen.org/gfabasic
    
./Post n°3   Marquer comme non lu.
Kevin Kofler Ecrit le: Samedi 16 septembre 2006 à 00:19 Déconnecté(e)    Voir le profil de Kevin Kofler Envoyer un email à Kevin Kofler Visiter le site WEB de Kevin Kofler Envoyer un message privé à Kevin Kofler  


Il s'agit d'un conflit entre le passage par registres (automatique dans ce cas vu que c'est une fonction non-exportée) et le chain link des fonctions imbriquées (c'est-à-dire le pointeur vers le stack frame de la fonction conteneur). Les deux veulent utiliser le registre %a0. Workarounds possibles:
    bool GFA_OperatorStack_CheckLevel(const GFA_StackTag *stack asm("a1"), const GFA_tag *tag asm("a2")) {

ou:
    __attribute__((stkparm)) bool GFA_OperatorStack_CheckLevel(const GFA_StackTag *stack, const GFA_tag *tag) {

(Je conseille le premier.)
Je ne peux pas tester vu qu'il me manque un fichier pour linker, mais l'analyse du code généré me dit que les deux solutions corrigent ton problème.

C'est bien entendu un bogue de GCC qui sera corrigé aussitôt que possible, même si la présence de workarounds le rendent moins critique.
Membre de l'équipe de TIGCC: http://tigcc.ticalc.org
Mainteneur du portage Linux/Unix de TIGCC: http://tigcc.ticalc.org/linux/
Membre de l'équipe de CalcForge: http://www.calcforge.org:70/

Participez à la reprise de Ti-Gen!
    
./Post n°4   Marquer comme non lu.
Kevin Kofler Ecrit le: Samedi 16 septembre 2006 à 03:29 Déconnecté(e)    Voir le profil de Kevin Kofler Envoyer un email à Kevin Kofler Visiter le site WEB de Kevin Kofler Envoyer un message privé à Kevin Kofler  


Tiens, il y a même un FIXME pour ton truc:
#if ! defined (PCC_STATIC_STRUCT_RETURN) && defined (M68K_STRUCT_VALUE_REGNUM)
  /* If return value is a structure, and we pass the buffer address in a
     register, we can't use this register for our own purposes.
     FIXME: Something similar would be useful for static chain.  */
  if (fntype && aggregate_value_p (TREE_TYPE (fntype), fntype))
    cum->regs_already_used |= (1 << M68K_STRUCT_VALUE_REGNUM);
#endif

(Le "static chain" est exactement le chain link duquel je parlais.) Comme quoi le patch de passage de registres que j'ai mergé n'était pas particulièrement top. :(
Membre de l'équipe de TIGCC: http://tigcc.ticalc.org
Mainteneur du portage Linux/Unix de TIGCC: http://tigcc.ticalc.org/linux/
Membre de l'équipe de CalcForge: http://www.calcforge.org:70/

Participez à la reprise de Ti-Gen!
    
./Post n°5   Marquer comme non lu.
Kevin Kofler Ecrit le: Samedi 16 septembre 2006 à 04:09 Déconnecté(e)    Voir le profil de Kevin Kofler Envoyer un email à Kevin Kofler Visiter le site WEB de Kevin Kofler Envoyer un message privé à Kevin Kofler  


Je viens de vérifier: ce problème est toujours marqué FIXME dans le GCC m68k-amigaos le plus récent que j'ai trouvé (3.4.0). Vu que la version du patch que j'avais mergée à l'époque, c'était pour GCC 2.95.3, on ne peut pas dire que ça ait évolué beaucoup. (Je compte quand-même resynchroniser à un moment. Mais la période d'activité du portage AmigaOS a l'air d'être finie à nouveau, donc la version avec laquelle synchroniser est elle-même pour un vieux GCC, donc ça réduit un peu l'intérêt. Si j'avais eu le temps de me plonger là-dessus à l'époque de GCC 3.3 où ils avaient un patch à jour, ça aurait été mieux, mais tant pis.)
Membre de l'équipe de TIGCC: http://tigcc.ticalc.org
Mainteneur du portage Linux/Unix de TIGCC: http://tigcc.ticalc.org/linux/
Membre de l'équipe de CalcForge: http://www.calcforge.org:70/

Participez à la reprise de Ti-Gen!
    
./Post n°6   Marquer comme non lu.
Kevin Kofler Ecrit le: Samedi 16 septembre 2006 à 05:42 Déconnecté(e)    Voir le profil de Kevin Kofler Envoyer un email à Kevin Kofler Visiter le site WEB de Kevin Kofler Envoyer un message privé à Kevin Kofler  


Corrigé:
2006-09-16  Kevin Kofler  <Kevin@tigcc.ticalc.org>

        * version.c (VERSUFFIX): Bump to "4.1.2-pre9".
        * config/m68k/m68k.md (m68k_init_cumulative_args): Mark STATIC_CHAIN_REGNUM as used for
            nested functions needing a static chain so register parameters don't conflict.

Je committe et puis j'uploade la mise à jour sur Ti-News.
Membre de l'équipe de TIGCC: http://tigcc.ticalc.org
Mainteneur du portage Linux/Unix de TIGCC: http://tigcc.ticalc.org/linux/
Membre de l'équipe de CalcForge: http://www.calcforge.org:70/

Participez à la reprise de Ti-Gen!
    
./Post n°7   Marquer comme non lu.
Kevin Kofler Ecrit le: Samedi 16 septembre 2006 à 06:18 Déconnecté(e)    Voir le profil de Kevin Kofler Envoyer un email à Kevin Kofler Visiter le site WEB de Kevin Kofler Envoyer un message privé à Kevin Kofler  


Voilà: http://www.ti-news.net/projects/gcc41/.
Membre de l'équipe de TIGCC: http://tigcc.ticalc.org
Mainteneur du portage Linux/Unix de TIGCC: http://tigcc.ticalc.org/linux/
Membre de l'équipe de CalcForge: http://www.calcforge.org:70/

Participez à la reprise de Ti-Gen!
    
./Post n°8   Marquer comme non lu.
Sasume Ecrit le: Samedi 16 septembre 2006 à 12:05 Déconnecté(e)    Voir le profil de Sasume Envoyer un email à Sasume Visiter le site WEB de Sasume Envoyer un message privé à Sasume  

#top# Tu es efficace quand tu t'y mets.
Mais n'oublie pas de dormir :D
    
./Post n°9   Marquer comme non lu.
geogeo Ecrit le: Samedi 16 septembre 2006 à 14:40 Déconnecté(e)    Voir le profil de geogeo Envoyer un email à geogeo Visiter le site WEB de geogeo Envoyer un message privé à geogeo  


Merci beaucoup Kevin. :)
A chaque fois que je codes je trouves des bugs dans TIGCC. :D
Concernant mon code, les #define... sont pas top. Y a pas mieux pour organiser?
Webmaster du site.
Programmeur sur TI68K. Arkanoid, Nebulus, GFA-Basic.

Plus d'informations sur GFA-Basic (un langage Basic pour TI68K).
http://www.tigen.org/gfabasic
    
./Post n°10   Marquer comme non lu.
geogeo Ecrit le: Lundi 25 septembre 2006 à 20:18 Déconnecté(e)    Voir le profil de geogeo Envoyer un email à geogeo Visiter le site WEB de geogeo Envoyer un message privé à geogeo  


Je crois que j'ai toujours un pb avec ce genre de code, j'obtiens un Addres Error, cf Mini message.
Webmaster du site.
Programmeur sur TI68K. Arkanoid, Nebulus, GFA-Basic.

Plus d'informations sur GFA-Basic (un langage Basic pour TI68K).
http://www.tigen.org/gfabasic
    
./Post n°11   Marquer comme non lu.
Kevin Kofler Ecrit le: Lundi 25 septembre 2006 à 23:27 Déconnecté(e)    Voir le profil de Kevin Kofler Envoyer un email à Kevin Kofler Visiter le site WEB de Kevin Kofler Envoyer un message privé à Kevin Kofler  


C'est un buffer underflow, cf. message privé.
Membre de l'équipe de TIGCC: http://tigcc.ticalc.org
Mainteneur du portage Linux/Unix de TIGCC: http://tigcc.ticalc.org/linux/
Membre de l'équipe de CalcForge: http://www.calcforge.org:70/

Participez à la reprise de Ti-Gen!
    
./Post n°12   Marquer comme non lu.
geogeo Ecrit le: Mardi 26 septembre 2006 à 15:53 Déconnecté(e)    Voir le profil de geogeo Envoyer un email à geogeo Visiter le site WEB de geogeo Envoyer un message privé à geogeo  


ok merci
Webmaster du site.
Programmeur sur TI68K. Arkanoid, Nebulus, GFA-Basic.

Plus d'informations sur GFA-Basic (un langage Basic pour TI68K).
http://www.tigen.org/gfabasic
    
  :: Index » Forum Ti68K » Programmation C » [Résolu] Structure dans la pile avec sous fonction (12 réponse(s))
Pages : 1/1     « [1] » »|

.Répondre à ce sujet
Les boutons de code
[B]old[I]talic[U]nderline[S]trikethrough[L]ine Flip Hori[Z]ontallyFlip [V]erticallySha[D]ow[G]low[S]poilerCode [G][C]ite
Bullet [L]istList Item [K] Link [H][E]mail[P]icture SmileysHelp
Couleurs :
Saisissez votre message
Activer les smileys
     

Forum de Ti-Gen v3.0 Copyright ©2004 by Geoffrey ANNEHEIM
Webmaster: Kevin KOFLER, Content Admins: list, Server Admins: Tyler CASSIDY and Kevin KOFLER, DNS Admin: squalyl
Page générée en 57.53ms avec 18 requetes